home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
CRS
/
crs49.d81
/
hack9a.sfx
/
issue9a
Wrap
Text File
|
1990-02-12
|
108KB
|
3,008 lines
########
##################
###### ######
#####
##### #### #### ## ##### #### #### #### #### #### #####
##### ## ## #### ## ## ## ### ## #### ## ## ##
##### ######## ## ## ## ##### ## ## ## ## ##
##### ## ## ######## ## ## ## ### ## ## #### ## ##
##### #### #### #### #### ##### #### #### #### #### #### ######
##### ##
###### ###### ╔SSUE #9
################## ╩AN. 24, 1995
########
---------------------------------------------------------------------(V1.1)---
┼DITOR'S ╬OTES
BY ├RAIG ╘AYLOR
┴ND *DRUM BEAT PLEASE* HERE'S ANOTHER ISSUE OF ├OMMODORE ╚ACKING!! ╫E'VE
LASTED LONGER AND HAD MORE ISSUES PUT OUT THAN SOME OTHER MAGAZINES ╔ WON'T
DISCUSS (*WONDERING WHERE ISSUE 39 OF THAT MAG IS*).
╬OT MANY ├OMMODORE NOTES THIS TIME - THINGS HAVE GOTTEN A LITTLE BIT MORE
MONTATENOUS(SP - IT'S LATE) ON THE ├OMMODORE FRONT.
╔ WAS UNABLE TO GET AN ARTICLE BY ├RAIG ┬RUCE IN TIME BUT ╔ GOT THE NEXT
BEST THING: ┴N INTERVIEW WITH HIM!! ╒SERS OF HIS SOFTWARE MAY FIND THIS
INTERVIEW INTERESTING IN HOW HE LOOKS AT PROGRAMMING.
╥IGHT NOW ╔'M ENTERTAINING THE THOUGHT OF DROPPING ├= ╚ACKING AFTER ╔
GRADUATE WHICH WILL BE SOMETIME AROUND ╩ULY 1ST OF THIS YEAR. ╔'M INTERESTED
IN SOMEBODY WHO WOULD "CARRY THE REIGN" SO TO SPEAK, AND TAKE OVER MY JOB OF
NAGGING, BUGGING PEOPLE ETC :-) TO WRITE ARTICLES. ╔'VE GOT MY SYSTEM FAIRLY
AUTOMATED IN HANDLING REQUESTS HERE - IF THAT PERSON HAS A ╓┴╪ ACCOUNT THEN
╔ COULD SET THEM UP WITH A MAILSERVER, IF A ╒╬╔╪ ACCOUNT THEN THERE'S OODLES
OF THEM FLOATING ON THE NET THAT COULD BE USED. _╨╠┼┴╙┼_ WRITE TO ME AND
LEMME KNOW IF YOU'RE INTERESTED. ╔'M GOING TO TRY TO GET ONE MORE ISSUE OF
├OMMODORE ╚ACKING OUT BEFORE ╩ULY 1ST.
===========================================================================
╨LEASE NOTE THAT THIS ISSUE AND PRIOR ONES ARE AVAILABLE VIA ANONYMOUS ╞╘╨
FROM CCOSUN.CALTECH.EDU (AMONGUNDERS) UNDER /PUB/CBM/HACKING.MAG AND VIA A
MAILSERVER WHICH DOCUMENTATION CAN BE OBTAINED BY SENDING MAIL TO
"DUCK@PEMBVAX1.PEMBROKE.EDU" WITH A SUBJECT LINE OF "MAILSERVER" AND THE
LINES OF "HELP" AND "CATALOG" IN THE BODY OF THE MESSAGE.
===========================================================================
╠EGAL ═UMBO-╩UMBO
╨ERMISSION IS GRANTED TO RE-DISTRIBUT3E THIS "NET-MAGAZINE", IN WHOLE,
FREELY FOR NON-PROFIT USE. ╚OWEVER, PLEASE CONTACT INDIVIDUAL AUTHORS FOR
PERMISSION TO PUBLISH OR RE-DISTRIBUTE ARTICLES SEPERATELY. ┴ CHARGE OF NO
GREATER THAN 5 ╒╙ DOLLARS OR EQUIVLENT MAY BE CHARGED FOR LIBRARY SERVICE /
DISKETTTE COSTS FOR THIS "NET-MAGAZINE".
===========================================================================
╔N ╘HIS ╔SSUE:
├OMMODORE ╘RIVIA ├ORNER
╘HIS EDITION OF ├OMMODORE ╘RIVIA ├ORNER CONTAINS THE ANSWERS TO THE ╩ULY
EDITION OF TRIVIA ($070 - $07╞), THE QUESTIONS AND ANSWERS FOR ┴UGUST ($080 -
$08╞), ╙EPTEMBER ($090 - $09╞), ╧CTOBER ($0┴0 - $0┴╞), ╬OVEMBER ($0┬0 - $0┬╞),
AND THE QUESTIONS FOR THE ─ECEMBER EDITION ($0├0 - $0├╞). ┼NJOY THEM!
┴ ─IFFERENT ╨ERSPECTIVE, PART ╔╔
╘HIS MONTH ╟EORGE AND ╙TEVE CONTINUE THEIR SERIES ON 3─ GRAPHICS ON THE ├-64
WITH A LOOK AT HIDDEN FACES AND FILLED FACES. ╔N ADDITION TO ADDING THESE
FEATURES INTO LAST MONTH'S PROGRAM SOME OTHER IMPROVEMENTS TO THE OLD PROGRAM
WILL BE DISCUSSED, SUCH AS FAST MULTIPLICATION (AROUND 24 CYCLES) AND VARIOUS
BUG FIXES -- FOR INSTANCE, THE PROGRAM NOW WORKS ON OLDER ├-64'S WHICH
INITIALIZE COLOR ╥┴═ TO THE BACKGROUND COLOR WHEN THE SCREEN IS CLEARED (SORRY
ABOUT THAT ;-). ┴ VERY PRIMITIVE FORM OF TEXTURE MAPPING IS ALSO INCLUDED. ┴S
USUAL, FULL SOURCE AND EXECUTABLES ARE INCLUDED. ╘HE NATIVE ├64 FILES ARE IN A
╠YNX ARCHIVE, SO YOU WILL OBVIOUSLY NEED ╠YNX TO GET AT THEM -- CHECK YOUR
FAVORITE ┬┬╙ OR ╞╘╨ SITE.
2─ ╟RAPHICS ╘OOLBOX: ├IRCLES
╘O AUGMENT THREE-DIMENSIONAL ALGORITHMS THIS SERIES WILL FOCUS ON
TWO-DIMENSIONAL DRAWING ALGORTIHMS. ├IRCLES ARE THE SUBJECT THIS
TIME AROUND (HEH -- GET IT?), AND A VERY FAST ALGORITHM FOR DRAWING
THEM ON YOUR ├64 IS PRESENTED, WITH EXAMPLES IN ASSEMBLY AND ┬┴╙╔├7.0.
╚OW FAST IS FAST? ╚OW DOES 11 CYCLES PER PIXEL WITHOUT THE USE OF
TABLES GRAB YA?
┴╞╠╔=SPECS V1.0
╔N ┴╞╠╔ WE CAN GET 120 COLORS IN THEORY (COUNTED LIKE THIS
16!/(2!*14!)=120). ╫HEN WE PUT RED AND BLUE HIRES PIXELS CLOSE TO
EACH OTHER WE GET A VISION OF PURPLE - THANKS THE TELEVISION. ╘HIS ARTICLE
DETAILS WHAT ┴╞╠╔ IS, HOW IT'S USED AND DONE.
├ODING ╘RICKS
╔NCLUDED ARE A SERIES OF POSTINGS TO COMP.SYS.CBM ABOUT NEAT CODING TRICKS (IN
MACHINE LANGUAGE) THAT ARE INTERESTING AND USEFUL.
├.╙.┬RUCE ╔NTERVIEW
┴N INTERVIEW WITH THE AUTHOR OF ┌ED, THE ┴├┼ OS AND MANY OTHER NUMEROUS
UTILITIES FOR THE ├OMMODORE 64/128.
┴LIGNING 1541 ─RIVES
┴ DISCUSSION REGARDING ├OMMODORE 1541 DISK DRIVE ALIGNMENT PROCEDURES, WITH
SUGGESTIONS.
===========================================================================
├OMMODORE ╘RIVIA ├ORNER
BY ╩IM ┬RAIN (BRAIN@MAIL.MSEN.COM)
╫ELL, IT IS A NEW YEAR, AND ╔ AM SENDING UP A NEW COLLECTION OF THE
├OMMODORE RIVIA FOR ALL TO ENJOY. ╔F YOU HAVEN'T SEEN THIS ALREADY, THE
FOLLOWING IS A COLLECTION OF TRIVIA QUESTIONS THAT ╔ POST TO VARIOUS
NETWORKS EVERY MONTH. ╔ HAVE COLLECTED ╘RIVIA ┼DITION #8-13 IN THIS
ARTICLE. ┴S YOU MAY KNOW, THESE QUESTIONS FORM PART OF A CONTEST IN WHICH
THE MONTHLY WINNER GETS A PRIZE (╘HANKS TO MY VARIOUS PRIZE DONATORS).
╘HE WHOLE THING IS MAINLY JUST FOR FUN, SO PLEASE ENJOY.
┴S THE NEW YEAR ROLLS IN, ╔ AM HAPPY TO REPORT THE FOLLOWING:
1) ┴S ╔ HAVE GAINED ACCESS TO ╞╔─╧╬ET, THE TRIVIA IS NOW POSTED TO BOTH
THE ╒╙┼╬┼╘ NEWSGROUP ├╧═╨.╙┘╙.├┬═ ON THE ╔NTERNET ┴╬─ THE ╞╔─╧╬ET ECHO
├┬═ EVERY MONTH.
2) ┴ NUMBER OF PUBLICATIONS HAVE STARTED PUBLISHING THE TRIVIA, INCLUDING
├OMMODORE ╫ORLD, AND A VARIETY OF CLUB NEWSLETTERS.
3) ╔ HAVE MOVED INTO MY NEW HOUSE (╙EE NEW ADDRESS AT BOTTOM). ╫HILE THIS
MAY NOT SEEM IMPORTANT, THE EXTRA ROOM ╔ NOW HAVE MEANS ╔ CAN NOW BRING
ALL OF MY OLD ├┬═ MACHINE TO THE NEW HOUSE AND WORK WITH THEM. ╫ORKING
WITH THEM GIVES ME FODDER FOR MORE TRIVIA.
┴S ALWAYS, ╔ WELCOME ANY QUESTIONS (WITH ANSWERS), AND ENCOURAGE PEOPLE
TO ENTER THEIR RESPONSES TO THE TRIVIA, NOW AT #13. ┬E SURE YOU GET THE
RESPONSES TO ME BY ╩ANUARY 12TH AT NOON.
╩IM.
╘HE FOLLOWING ARTICLE CONTAINS THE ANSWERS TO THE ╩ULY EDITION OF TRIVIA
($070 - $07╞), THE QUESTIONS AND ANSWERS FOR ┴UGUST ($080 - $08╞), ╙EPTEMBER
($090 - $09╞), ╧CTOBER ($0┴0 - $0┴╞), ╬OVEMBER ($0┬0 - $0┬╞), AND THE
QUESTIONS FOR THE ─ECEMBER EDITION ($0├0 - $0├╞). ┼NJOY THEM!
╚ERE ARE THE ANSWERS TO ├OMMODORE ╘RIVIA ┼DITION #8 FOR ╩ULY, 1994
╤ $070) ╧N A ╨┼╘ SERIES COMPUTER, WHAT VISUAL POWER-ON INDICATION WILL TELL
THE USER WHETHER THE COMPUTER HAS ╥EVISION 2 OR ╥EVISION 3 ╥╧═S?
┴ $070) ╥EVISION ╠EVEL 2 ╥╧═╙ (THE ONES WITH MORE BUGS) POWER UP WITH:
*** ├╧══╧─╧╥┼ ┬┴╙╔├ ***, WITH '*' IN PLACE OF THE MORE FAMILIAR
'#' CHARACTER.
╤ $071) ╘HE ╔┼┼┼-488 INTERFACE IS SOMETIMES CALLED THE ╟╨╔┬ INTERFACE.
╫HAT DOES ╟╨╔┬ STAND FOR?
┴ $071) ╟ENERAL ╨URPOSE ╔NTERFACE ┬US. ┴NOTHER NAME IS ╚EWLETT ╨ACKARD
╔NTERFACE ┬US (╚╨╔┬), SINCE ╚╨ DEVELOPED THIS STANDARD FOR ITS
ISTRUMENTATION DEVICE NETWORKING.
╤ $072) ├OMMODORE MANUFACTURED AT LEAST TWO HARD DRIVES WITH ╔┼┼┼-488
INTERFACES. ├AN YOU NAME THEM?
┴ $072) ╘HE ├OMMODORE ─9060 AND ─9090. ╞ROM THE CBMMODEL.TXT FILE:
* ├┬═ ─9060 5 ═┬ ╚ARD ─RIVE, ─╧╙3.0, ╧FF-╫HITE, ╔┼┼┼-488. ╟╨
* ├┬═ ─9090 7.5 ═┬ ╚ARD ─RIVE, ─╧╙3.0, ╧FF-╫HITE, ╔┼┼┼-488. ╟╨
╘HE FOLLOWING MODEL HAS BEEN SAID TO BE IN EXISTENCE, THOUGH NO ONE
HAS ONE ON HAND TO PROVE IT:
* ├┬═ ─9065 7.5 ═┬ ╚ARD ─RIVE
┴ND THIS MODEL MAY NEVER HAVE MADE IT PAST THE PROTOTYPE STAGE:
├┬═ ─9062 ─UAL ─9065.
╤ $073) ╫HY DIDN'T BUYERS LIKE THE ORIGINAL ╨┼╘-64?
┴ $073) ╔T LOOKED JUST LIKE A OLD-STYLE ├-64. ╔T HAD A "HOME" COMPUTER
LOOK THAT THE SCHOOLS DIDN'T CARE FOR. ╘HEY LIKED THE "BUSINESS"
LOOK OF THE ╨┼╘ SERIES, SO ├OMMODORE PUT REFURBISHED AND NEW 64
MOTHERBOARDS IN ╨┼╘ CASES AND SOLD THEM AS ╨┼╘ 64S. ╘HE REPACKAGING
SUITED THE SCHOOLS.
╤ $074) ╧N A ╨┼╘ ╥EVISION 2 ╥╧═, WHAT WAS THE LARGEST SINGLE ARRAY SIZE THAT
┬┴╙╔├ COULD HANDLE?
┴ $074) ┴N ARRAY CAN HAVE A CUMULATIVE TOTAL OF 256 ELEMENTS. ╞OR SINGLE
DIMENSION ARRAYS, THAT MEANS ─(0) TO ─(255), BUT A 2─ ARRAY CAN ONLY
GO FROM ──(0,0) TO ──(1,127) ETC. ┴LL TYPES OF ARRAYS HAD THIS
LIMITATION.
╤ $075) ╧N THE STOCK 1541, DATA IS TRANSMITTED ONE BIT AT A TIME. ╚OW MANY
BITS ARE TRANSFERRED AT A TIME ON THE ├OMMODORE 1551 DISK DRIVE?
┴ $075) 3 BITS WERE TRANSMITTED AT A TIME. ╔ ASSUME THAT EACH BYTE HAD A
PARITY BIT TACKED ON FOR ERROR DETECTION, SO IT WOULD HAVE TAKEN
3 TRANSFERS TO TRANSMIT A BYTE OF INFORMATION FROM THE DRIVES.
╤ $076) ╧N ALL ├OMMODORE FLOPPY DISK DRIVES, HOW FAST DOES THE DISK SPIN?
┴ $076) 300 ╥╨═.
╤ $077) ╒PON FIRST READING THE ├OMMODORE 1541 ┼RROR CHANNEL AFTER TURNING
ON THE DISK DRIVE, WHAT ERROR NUMBER AND TEXT IS RETURNED?
┴ $077) 73, ├┬═ ─╧╙ ╓2.6 1541, 0, 0
╤ $078) ╫HAT ERROR NUMBER AND TEXT IS RETURNED ON A 1551?
┴ $078) 73, ├┬═ ─╧╙ ╓2.6╘─╔╙╦, 0, 0 ╬OTICE THAT THE NEW TEXT ╩╒╙╘ FITS!
╤ $079) ├OMMODORE PRINTERS ARE NORMALLY ASSIGNED TO DEVICE #4, BUT THEY
CAN BE ALSO USED AS DEVICE #?
┴ $079) #5. ╘HE ├OMMODORE 1525 HAS A SWITCH TO DO THIS, BUT NOT ALL PRINTERS
HAVE SUCH A SWITCH.
╤ $07┴) ╫HAT MICROPROCESSOR IS USED IN THE ├OMMODORE 1551 DISK DRIVE?
┴ $07┴) THE 6510╘. ╔T IS A SLIGHT VARIANT ON THE 6510 MICROPROCESSOR USED
ON THE ├64. ╙OME SAY IT RUNS AT 2 ═╚Z, BUT THE SPECS DRIVES SPEC
SHEET DOESN'T SAY.
╤ $07┬) ╫HEN THE ╓╔├-20 WAS DESIGNED, THE SERIAL PORT THROUGHPUT WAS ROUGHLY
EQUIVALENT TO THE THROUGHPUT OF THE ╔┼┼┼-488 BUS? ╫HY ISN'T IT
VERY FAST IN PRODUCTION ╓╔├S?
┴ $07┬) ╠ET'S GO BACK TO QUESTION $04╞:
<BEGIN INSERT>
╤ $04╞) ╫HAT WAS THE PRIMARY REASON ├OMMODORE WENT TO A SERIAL BUS
WITH THE INTRODUCTION OF THE ╓╔├-20?
┴ $04╞) ╩IM ┬UTTERFIELD SUPPLIED ME WITH THIS ONE:
┴S YOU KNOW, THE FIRST ├OMMODORE COMPUTERS USED THE ╔┼┼┼ BUS
TO CONNECT TO PERIPHERALS SUCH AS DISK AND PRINTER. ╔
UNDERSTAND THAT THESE WERE AVAILABLE ONLY FROM ONE SOURCE:
┬ELDEN CABLES. ┴ COUPLE OF YEARS INTO ├OMMODORE'S COMPUTER
CAREER, ┬ELDEN WENT OUT OF STOCK ON SUCH CABLES (MILITARY
CONTRACT? WHO KNOWS?). ╔N ANY CASE, ├OMMODORE WERE IN QUITE
A FIX: THEY MADE COMPUTERS AND DISK DRIVES, BUT COULDN'T
HOOK 'EM TOGETHER! ╙O ╘RAMIEL ISSUED THE ORDER: "╧N OUR NEXT
COMPUTER, GET OFF THAT BUS. ═AKE IT A CABLE ANYONE CAN
MANUFACTURE". ┴ND SO, STARTING WITH THE ╓╔├-20 THE SERIAL
BUS WAS BORN. ╔T WAS INTENDED TO BE JUST AS FAST AS THE
╔┼┼┼-488 IT REPLACED.
<END INSERT>
┴ND HERE IS WHAT ╩IM ┬UTTERFIELD FOLLOWED UP WITH:
"╘ECHNICALLY, THE IDEA WAS SOUND: THE 6522 ╓╔┴ CHIP HAS A "SHIFT
REGISTER" CIRCUIT THAT, IF TICKLED WITH THE RIGHT SIGNALS (DATA AND
CLOCK) WILL CHEERFULLY COLLECT 8 BITS OF DATA WITHOUT ANY HELP FROM
THE ├╨╒. ┴T THAT TIME, IT WOULD SIGNAL THAT IT HAD A BYTE TO BE
COLLECTED, AND THE PROCESSOR WOULD DO SO, USING AN AUTOMATIC
HANDSHAKE BUILT INTO THE 6522 TO TRIGGER THE NEXT INCOMING BYTE.
╘HINGS WORKED IN A SIMILAR WAY OUTGOING FROM THE COMPUTER, TOO.
╫E EARLY ╨┼╘/├┬═ FREAKS KNEW, FROM PLAYING MUSIC, THAT THERE WAS
SOMETHING WRONG WITH THE 6522'S SHIFT REGISTER: IT INTERFERED WITH
OTHER FUNCTIONS. ╘HE RULE WAS: TURN OFF THE MUSIC BEFORE YOU START
THE TAPE! (╘HE SHIFT REGISTER WAS A POPULAR SOUND GENERATOR). ┬UT
THE ├OMMODORE ENGINEERS, WHO ONLY MADE THE CHIP, DIDN'T KNOW THIS.
╒NTIL THEY GOT INTO FINAL CHECKOUT OF THE ╓╔├-20.
┬Y THIS TIME, THE ╓╔├-20 BOARD WAS IN MANUFACTURE. ┴ NEW CHIP COULD
BE DESIGNED IN A FEW MONTHS (YES, THE SILICON GUYS HAD APPLICATION
NOTES ABOUT THE PROBLEM, LONG SINCE), BUT IT WAS ╘╧╧ ╠┴╘┼!
┴ MAJOR SOFTWARE REWRITE HAD TO TAKE PLACE THAT CHANGED THE ╓╔├-20
INTO A "BIT-CATCHER" RATHER THAN A "CHARACTER-CATCHER". ╔T CALLED FOR
EIGHT TIMES AS MUCH WORK ON THE PART OF THE ├╨╒; AND UNLIKE THE SHIFT
REGISTER PLAN, THERE WAS NO TIMING/HANDSHAKE SLACK TIME. ╘HE WHOLE
THING SLOWED DOWN BY A FACTOR OF APPROXIMATELY 5 TO 6.
╫HEN THE 64 CAME OUT, THE PROBLEM ╓╔┴ 6522 CHIP HAD BEEN
REPLACED BY THE ├╔┴ 6526. ╘HIS DID NOT HAVE THE SHIFT REGISTER
PROBLEM WHICH HAD CAUSED TROUBLE ON THE ╓╔├-20, AND AT THAT TIME IT
WOULD HAVE BEEN POSSIBLE TO RESTORE PLAN 1, A FAST SERIAL BUS. ╬OTE
THAT THIS WOULD HAVE CALLED FOR A REDESIGN OF THE 1540 DISK DRIVE,
WHICH ALSO USED A ╓╔┴. ┴S BEST ╔ CAN ESTIMATE - AND AN ARTICLE IN
THE ╔┼┼┼ ╙PECTRUM MAGAZINE SUPPORTS THIS - THE MATTER WAS DISCUSSED
WITHIN ├OMMODORE, AND IT WAS DECIDED THAT ╓╔├-20 COMPATIBILITY WAS
MORE IMPORTANT THAN DISK SPEED. ╨ERHAPS THE PROSPECT OF A 1541
REDESIGN WAS AN IMPORTANT PART OF THE DECISION, SINCE CURRENT
INVENTORIES NEEDED TO BE TAKEN INTO ACCOUNT. ┬UT TO KEEP THE
├OMMODORE 64 AS A "BIT-BANGER", A NEW PROBLEM AROSE.
╘HE HIGHER-RESOLUTION SCREEN OF THE 64 (AS COMPARED TO THE ╓╔├-20)
COULD NOT BE SUPPORTED WITHOUT STOPPING THE ├╨╒ EVERY ONCE IN A WHILE.
╘O BE EXACT: ┼VERY 8 SCREEN RASTER LINES (EACH LINE OF TEXT), THE ├╨╒
HAD TO BE PUT INTO A ╫┴╔╘ CONDITION FOR 42 MICROSECONDS, SO AS TO
ALLOW THE NEXT LINE OF SCREEN TEXT AND COLOR NYBBLES TO BE SWEPT INTO
THE CHIP.(═ORE TIME WOULD BE NEEDED IF SPRITES WERE BEING USED).
┬UT THE BITS WERE COMING IN ON THE SERIAL BUS FASTER THAN THAT:
A BIT WOULD COME IN ABOUT EVERY 20 MICROSECONDS! ╙O THE POOR ├╨╒,
FROZEN FOR LONGER THAN THAT, WOULD MISS SOME SERIAL BITS COMPLETELY!
├OMMODORE'S SOLUTION WAS TO SLOW DOWN THE SERIAL BUS EVEN MORE.
╘HAT'S WHY THE ╓╔├-20 HAS A FASTER SERIAL BUS THAN THE 64, EVEN THOUGH
THE 64 WAS CAPABLE, TECHNICALLY, OF RUNNING MANY TIMES FASTER.
╞AST DISK FINALLY CAME INTO ITS OWN WITH THE ├OMMODORE 128."
--╩IM
╤ $07├) ╧N ├OMMODORE COMPUTERS, HOW MUCH ╥┴═ IS SET ASIDE AS A TAPE BUFFER?
┴ $07├) 192 BYTES IS USED AS A TAPE BUFFER. ┬LOCKS OF DATA ON TAPE ARE 192
BYTES LONG.
╤ $07─) ╧N ├OMMODORE COMPUTERS, MOST EVERY PERIPHERAL HAS A DEVICE NUMBER.
╫HAT IS THE DEVICE NUMBER OF THE SCREEN?
┴ $07─) #3
╤ $07┼) ╫HAT IS THE DEVICE NUMBER OF THE KEYBOARD?
┴ $07┼) #0
╤ $07╞) ├OMMODORE COMPUTERS USE 2'S-COMPLEMENT NOTATION TO REPRESENT INTEGERS.
╫HAT IS THE 2'S-COMPLEMENT HEX REPRESENTATION OF THE SIGNLE BYTE -1?
┴ $07╞) (╘HIS WAS NOT A ├OMMODORE SPECIFIC QUESTION) ├OMMODORE COMPUTERS
USE THIS NOTATION TO REPRESENT INTEGER QUANTITIES. ╔N 2'S COMPLEMENT
NOTATION, A -1 LOOKS LIKE 11111111(BINARY) OR $╞╞(HEX).
╚ERE ARE THE ANSWERS TO ├OMMODORE ╘RIVIA ┼DITION #9 FOR ┴UGUST, 1994
╤ $080) ─URING THE DAYS OF THE ├OMMODORE 64 AND THE ╓╔├-20, ├OMMODORE
PRODUCED AT LEAST TWO ├OMMODORE MAGAZINES. ╫HAT WERE THEIR NAMES?
┴ $080) ╘HE MAGAZINES WERE ORIGINALLY CALLED "├OMMODORE ═ICROCOMPUTERS" AND
"╨OWER/╨LAY: ├OMMODORE ╚OME ├OMPUTING". ╘HEY NEVER DID SEEM TO NAIL
DOWN THE NAME OF THE LATTER AS ╔ SEE "╨OWER/╨LAY" AND
"├OMMODORE: ╨OWER/╨LAY" USED AS THE ORIGINAL NAMES AS WELL. ┴NYWAY,
├OMMODORE ═ICROCOMPUTERS STARTED ITS LIFE IN 1979, WHEREAS
"╨OWER/╨LAY" STARTED IN 1981. ┬OTH MAGAZINES WERE PUBLISHED UNTIL
AROUND 1987, WHEN THEY WERE MERGED TO FORM "├OMMODORE ═AGAZINE".
╘HEN, AROUND 1990, THE MAGAZINE WAS SOLD TO ╔─╟ ├OMMUNICATIONS AND
WAS MERGED INTO ╥╒╬. ╥╒╬ WAS CONTINUED FOR A WHILE, BUT WAS FINALLY
PULLED OUT OF CIRCULATION. ├REATIVE ═ICRO ─ESIGNS PURCHASED THE
RIGHTS TO THE MAGAZINE, AND NOW ├OMMODORE ╫ORLD IS BEING PRODUCED BY
├═─. ╔ AM NOT SURE HOW STRONG (IF ANY) A LINK THERE IS BETWEEN
╥╒╬ AND ├╫, BUT SOME OF THE SAME AUTHORS WRITE FOR THE NEW
PUBLICATION. ╩UST FOR ADDED INFO, HERE ARE THE ╔╙╙╬ NUMBERS:
├OMMODORE ═ICROCOMPUTERS (├OMMODORE ═AGAZINE) 0744-8724
╨OWER/╨LAY:├OMMODORE ╚OME ├OMPUTING 0739-8018
╥╒╬ (├OMMODORE/╥╒╬) 0741-4285
"╘HE ╘RANSACTOR" IS ALSO A CORRECT ANSWER, AND INFO ON IT IS BELOW.
╤ $081) ┬ACK IN THE ╨┼╘ HEYDAY, ANOTHER MAGAZINE WAS PRODUCED BY ├OMMODORE
├ANADA. ╘HIS MAGAZINE WAS LATER SOLD AND SHOWED UP AS A HARDWARE
JOURNAL. ╬AME THE MAGAZINE.
┴ $081) ╘HE INFAMOUS "╘ARNSACTOR". ╧NE OF THE NOTED ├64 HARDWARE-HACKING
MAGAZINES, IT WAS ORIGINALLY PUBLISHED BY ├OMMODORE ├ANADA, BEFORE
BEING SOLD TO AN INDIVIDUAL NAMED ═R. ╚ILDEN. ╔TS ╔╙╙╬ NUMBER IS
0838-0163. ┴S FAR AS ╔ CAN TELL, THIS MAGAZINE, DIED MANY DEATHS,
BUT CEASED TO EXIST IN 1989-90. ╔TS FIRST ISSUE IS DATED ┴PRIL 30,
1978.
╤ $082) ╘HE ├OMMODORE 128 HAS A ╓╔├-╔╔ COMPATIBLE CHIP INSIDE IT. ├AN THIS
CHIPS BE SWITCHED FOR A ╓╔├-╔╔ FROM A ├OMMODORE 64?
┴ $082) ╬O! ╘HE NEWER 128 COMPATIBLE CHIP (╓╔├-╔╔E) HAS 8 EXTRA PINS TO
PERFORM TIMING FUNCTIONS SPECIFIC FOR THE 128. ╔N ADDITION, SOME OF
THE REGISTERS HAVE EXTRA FUNCTIONS. ╚OWEVER, A SUITABLE CARD
TO MAKE IT COMPATIBLE CAN BE MADE.
╤ $083) ╫HAT DOES THE VIDEO ENCODING STANDARD ╨┴╠ EXPAND TO?
┴ $083) ╨HASE ┴LTERNATING ╠INE IS THE ANSWER ╔ WAS LOOKING FOR, WHICH
DESCRIBES THE VIDEO ENCODING USED IN ┼UROPE, BUT ╨ROGRAMMABLE ┴RRAY
╠OGIC IS ALSO CORRECT, WHICH DESCRIBES THE FAMILY OF CHIPS USED AS
"GLUE" LOGIC FOR THE ├64 ╔/╧ AND PROCESSING CHIPS.
╤ $084) ╚OW MANY BUTTONS WERE PRESENT ON THE EARLIEST OF ├OMMODORE TAPE DECKS?
┴ $084) 5: ╨LAY, ╥EWIND, ╞AST-╞ORWARD, ╥ECORD, AND ╙TOP/┼JECT. ╠ATER MODELS
SEPARATED THE STOP AND EJECT FUNCTIONS INTO TWO BUTTONS.
╤ $085) ┼ARLIER ╙╔─ CHIPS HAD A DISTINCTIVE "CLICKING" SOUND THAT SOME DEMO
CODERS USED TO AN ADVANTAGE. ├OMMODORE SUBSEQUENTLY REMOVED THE
CLICK, AND THEN LATER REINTRODUCED IT. ╫HEN DOES THE TELLTALE CLICK
OCCUR?
┴ $085) ╫HEN YOU CHANGE THE VOLUME OF A VOICE. ╘HE VOICE NEED NOT BE
OUTPUTTING ANYTHING.
╤ $086) ╫HAT DOES ├╨/═ STAND FOR?
┴ $086) ╘AKE YOUR PICK:
├ONTROL ╨ROGRAM/═ONITOR
├ONTROL ╨ROGRAM FOR ═ICROPROCESSORS
├ONTROL ╨ROGRAM FOR ═ICROCOMPUTERS.
╘HE LAST ONE IS CONSIDERED BY MANY TO BE MOST CORRECT.
╤ $087) ╫HAT IS THE HIGHEST LINE NUMBER ALLOWED FOR A PROGRAM LINE IN
├OMMODORE ┬┴╙╔├ ╓2?
┴ $087) ╬ORMALLY, THE USER CANNOT ENTER A LINE NUMBER HIGHER THAN 63999.
╔F YOU WANT TO BE TRICKY, HOWEVER, THE NUMBERS CAN BE MADE TO GO UP
TO 65535.
╤ $088) ╫HAT SYMBOL, CLEARLY PRINTED ON THE FRONT OF A KEY ON THE ├OMMODORE
╓╔├, 64, AND 128 KEYBOARD, IS NOT AVAILABLE WHEN THE LOWER CASE
CHARACTER SET IS SWITCHED IN?
┴ $088) ╘HE ╨╔ SYMBOL. ╔T IS [╙╚╞╘-╒╨┴╥╥╧╫] IN UPPERCASE MODE, BUT BECOMES
A CHECKERBOARD-LIKE CHARACTER WHEN IN LOWER-CASE MODE. ╒NLIKE THE
GRAPHICS CHARACTERS PRINTED ON THE FRONTS OF THE KEYS, THIS ONE IS
POSITIONED IN THE MIDDLE OF THE KEYCAP, AND SHOULD PROBABLY BE
ACCESSIBLE IN BOTH CHARACTER SETS.
╤ $089) ╚OW DO YOU GET THE "CHECKMARK" CHARACTER ?
┴ $089) ╔N LOWERCASE MODE, TYPE A SHIFT-@
╤ $08┴) ╧N THE ╨┼╘ COMPUTERS, WHAT MEMORY LOCATION HOLDS THE ╦ERNAL ╥╧═
VERSION?
┴ $08┴) ╔T IS DIFFERENT FROM THE 64/128. ╔T IS 50003. 0 HERE INDICATES OLD
╥╧═S, WHILE 1 INDICATES NEW ╥╧═S.
╤ $08┬) ╘HE ├OMMODORE COMPUTERS HAVE 2 INTERRUPTS, CALLED ╔╥╤ AND ╬═╔.
╫HAT DOES ╔╥╤ STAND FOR?
┴ $08┬) ╔NTERRUPT ╥E╤UEST. ╘HIS INTERRUPT IS USED FOR THINGS THAT SHOULD
USUALLY BE ALLOWED TO INTERRUPT THE PROCESSOR. ╘HIS INTERRUPT CAN
BE MASKED OFF BY THE ╙┼╔ INSTRUCTION.
╤ $08├) ╫HAT DOES ╬═╔ STAND FOR?
┴ $08├) ╬ON-═ASKABLE ╔NTERRUPT. ╒NLIKE THE ╔╥╤, THIS INTERRUPT CANNOT BE
MASKED BY AN INSTRUCTION. ╚OWEVER, SOME TRICKS CAN BE USED TO
MASK IT.
╤ $08─) ╘HE 6502 LINE OF MICROPROCESSORS HAS A NUMBER OF FLAGS THAT CAN BE
USED TO TEST FOR CERTAIN CONDITIONS. ╧NE OF THEN IS THE ╬ FLAG.
╫HAT DOES IT STAND FOR?
┴ $08─) '╬' STANDS FOR ╬EGATIVE. ╧N INSTRUCTIONS THAT CHANGE THIS FLAG, IT
IS SET TO BE EQUAL TO BIT 7 OF THE RESULT OF THE INSTRUCTION.
╤ $08┼) ╚OW ABOUT THE ─ FLAG?
┴ $08┼) ╔T STANDS FOR DECIMAL MODE. ╘HIS MODE CAUSES CERTAIN INSTRUCTIONS
TO TREAT A BYTE AS 2 4 BIT ┬├─-CODED NYBBLES.
╤ $08╞) ╘HE SHORTHAND FOR THE ┬┴╙╔├ KEYWORD ╨╥╔╬╘ IS '?'. ╫HAT IS THE
SHORTHAND EQUIVALENT FOR ╨╥╔╬╘#?
┴ $08╞) P╥ IS THE WAY TO ABBREVIATE ╨╥╔╬╘#. ╬OTE THAT ?# WILL FAIL.
╚ERE ARE THE ANSWERS TO ├OMMODORE ╘RIVIA ┼DITION #10 FOR ╙EPTEMBER, 1994
╤ $090) ╘HE 6502 HAS A RICH HISTORY. ╔T IS MODELED AFTER ANOTHER 8-BIT
MICROPROCESSOR. ╬AME THE PROCESSOR.
┴ $090) ╘HE 65╪╪ SERIES OF PROCESSORS WAS MODELED AFTER THE ═OTOROLA 6800.
═OTOROLA HAMPERED THE DESIGN GROUPS' EFFORTS TO PURSUE PRODUCT
DEVELOPMENTS USING THE 6800. ┴ CORE GROUP OF 8 DESIGNERS LEFT ═OTOROLA
AND WENT TO ═╧╙ ╘ECHNOLOGIES, WHICH WAS THE LARGEST PRODUCER OF
CALCULATOR CHIPS AT THE TIME. ═╧╙ DECIDED IT WAS TIME TO GO INTO
THE ├╨╒ BUSINESS.
╤ $091) ╘HE 6502 HAS A OLDER BROTHER THAT WAS NEVER PRODUCED. ╬AME ITS
NUMBER DESIGNATION AND WHY IT WAS NOT PRODUCED.
┴ $091) ╘HE OLDER BROTHER TO THE 6502 WAS THE 6501. ╘HE 6501 WAS
PIN-COMPATIBLE WITH THE 6800, WHICH PROMPTED A SUIT BY ═OTOROLA.
┼VENTUALLY, ═╧╙ REACHED AN AGREEMENT WHERE THEY SCRAPPED THE 6501
MARKETING, BUT WERE FREE TO MARKET THE 6502.
╤ $092) ╚OW MANY DIFFERENT OPCODES ARE CONSIDERED VALID AND "LEGAL" ON THE
═╧╙ ╬═╧╙ 6502 LINE?
┴ $092) 151 OPCODES ARE DOCUMENTED IN THE ╬═╧╙ 6502 DATA BOOK. ╘HE REMAINING
105 OPCODES WERE NOT IMPLEMENTED, AND EXIST AS "DON'T CARE" STATES
IN THE OPCODE MATRIX. ╘HAT MEANS THAT SOME SEEMINGLY INVALID
OPCODES WILL ACTUALLY PERFORM PIECES OF TWO OR MORE VALID OPCODES.
╬EWER ├╨╒ SYSTEMS TRAP ALL NON-IMPLEMENTED OPCODE USAGES, BUT NOT
THE 6502.
╤ $093) ┼VERY INSTRUCTION TAKES AT LEAST __ CYCLES TO COMPLETE. ╞ILL IN
THE MISSING NUMBER.
┴ $093) 2. ╘HE ARCHITECTURE ASSUMES THAT EACH OPCODE HAS TWO BYTES IN IT AND
ONE BYTE CAN BE FETCHED PER CYCLE. ╞OR INSTRUCTIONS THAT USE ONLY
1 BYTE, THE EXTRA FETCHED BYTE (ACTUALLY THE NEXT OPCODE), IS THROWN
AWAY.
╤ $094) ╫HICH INSTRUCTIONS TAKE MORE TIME THAN NECESSARY AS A RESULT OF THE
ANSWER TO ╤ $093?
┴ $094) ┴LTHOUGH THIS IS A SUBJECTIVE ANSWER, ╧NE COULD NOMINATE ╬╧╨ ON THE
BASIS THAT ╬╧╨ IS GENERALLY BELIEVED TO WASTE ONE EXECUTION CYCLE ON
A PARTICULAR PROCESSOR, NAMELY ONE CYCLE ON THE 65╪╪ LINE. ╚OWEVER,
ONE CAN ARGUE THAT ╬╧╨ SIMPLY MEANS NO OPERATION, AND HAS NO TIES TO
LENGTH OF EXECUTION. ┘OU BE THE JUDGE.
┴LL OTHER INSTRUCTIONS MUST TAKE AT LEAST TWO CYCLES: ONE FOR OPCODE
FETCH, ONE FOR OPERATION.
╤ $095) ╫HAT DID ═╧╙ ╘ECHNOLOGIES MANUFACTURE BEFOR INTRODUCING THE 650╪ LINE
OF MICROPROCESSORS?
┴ $095) ┴S STATED ABOVE, IT WAS CALCULATOR CHIPS.
╤ $096) ╘HREE COMPANIES MANUFACTURED THE 6502 UNDER A CROSS-LICENSING
AGREEMENT. ╬AME THEM.
┴ $096) ╥OCKWELL, ═╧╙ ╘ECHNOLOGIES, AND ╙YNERTEK.
╤ $097) ╔N ╬╘╙├-LAND, HOW FAST DOES THE 1═╚Z 6510 IN THE ├64 ACTUALLY RUN?
┴ $097) 1.022727143 ═╚Z. ╔T IS DERIVED BY TAKING THE MAIN CLOCK FREQUENCY
(14.31818═╚Z) AND DIVING IT BY 14.
╤ $098) ╫HAT ABOUT IN ╨┴╠-LAND?
┴ $098) 985.248449 K╚Z. ╔T IS DERIVED BY TAKING THE MAIN CLOCK FREQUENCY
(17.734472═╚Z) AND DIVIDING IT BY 18. ╘HUS THE ╨┴╠ 64 ACTUALLY RUNS
SLOWER THAN THE ╬╘╙├ ONE.
╤ $099) ─ATA IS LATCHED INTO THE 650╪ MICROPROCESSOR ON THE (RISING/FALLING)
EDGE?
┴ $099) ─ATA IS LATCHED IN TO THE 65╪╪ ON THE FALLING EDGE OF ╨HI0 (╨HI1).
╘HE TIMING DIAGRAM IN SOME BOOKS (64 ╨╥╟ IS ONE) IS INCORRECT.
╤ $09┴) ╘HROUGH THE YEARS, THE 650╪ LINE HAS CHANGED FAMILY NUMBERS, YET
THE PART HAS NOT BEEN CHANGED. (┴ FAMILY NUMBER IS THE UPPER 2
DIGITS IN THIS CASE) ╬AME THE OTHER FAMILY NUMBERS USED BY ═╧╙ TO
DENOTE THE 650╪ LINE.
┴ $09┴) THE 75╪╪ LINE USED IN THE 264 SERIES (╨LUS/4 AND ├16), AND THE 85╪╪
SERIES USED IN THE ├64├ AND ├128 SERIES.
╤ $09┬) ├ONSIDER THE FOLLOWING CODE:
LDX #10
LDA $FF,X
WHAT LOCATION DOES THE ACCUMULATOR GET LOADED WITH?
┴ $09┬) ╘HE ANSWER IS LOCATION $FF+10 MOD 256 = $09.
╘HE ANSWER INVOLVES EXPLAINING A (MIS)FEATURES OF THE ╬═╧╙ 65╪╪ ├╨╒
LINE. ╘HE ABOVE CODE INSTRUCTS THE 65╪╪ ├╨╒ TO USE ZERO-PAGE
ADDRESSING MODE TO LOAD THE ACCUMULATOR. ╔N ZERO-PAGE ADDRESSING, THE
ADDRESS NEED ONLY BE ONE BYTE WIDE ($FF IN THIS CASE), BECAUSE THE
HIGH BYTE IS CONSIDERED TO BE $00. ╬OW, AS HUMANS, WE WOULD EXPECT
THE ├╨╒ WOULD ADD 10 TO 255 ($FF), GIVING 265 ($109) AS THE ADDRESS
TO LOAD THE ACCUMULATOR FROM. ╚OWEVER, THE ├╨╒ DESIGNERS DECIDED
THAT ZERO-PAGE ADDRESSING MEANS THAT THE HIGH BYTE WILL BE $00 ALL THE
TIME, NO EXCEPTIONS. ╔F A SITUATION LIKE THE ABOVE OCCURS, THE
LOW BYTE OF THE ADDITION WILL BE USED AS THE LOW BYTE OF THE ADDRESS
(9 IN THIS CASE), BUT THE HIGH-BYTE WILL BE ┌┼╥╧. ┴LL ZERO PAGE
ADDRESSING MODES WORK THIS WAY. ╬OTE THAT THE ├═╧╙ VERSIONS OF THE
6502 DO PERFORM THE HIGH BYTE "FIX-UP", SO THIS BEHAVIOR IS ONLY SEEN
ON THE ╬═╧╙ PARTS.
╤ $09├) ╫HAT ABOUT THE FOLLOWING?
LDX #10
LDA ($FF),X
┴ $09├) ╘HIS WAS A TRICK. ╘HE CODE IS TRYING TO USE ╔╬─╔╥┼├╘ ╔╬─┼╪┼─ INDEXING
MODE USING THE X REGISTER, BUT THAT ADDRESSING MODE CAN ONLY BE USED
WITH THE Y REGISTER. ╔F THE CODE IS CHANGED TO THE FOLLOWING, LEGAL
CODE:
LDX #10
LDA ($FF),Y
╘HEN, THE ABOVE DISCUSSION FOR ZERO-PAGE ADDRESSING HOLDS TRUE HERE
AS WELL. ╘HE EFFECTIVE ADDRESS WOULD HAVE BEEN (HI:LO) $100:$0FF, BUT
IS INSTEAD (HI:LO) $000:$0FF. ╘HE SIMPLE RULE IS: ZERO PAGE MEANS
EXACTLY THAT. ╘HERE IS NO WAY TO ADDRESS OUTSIDE OF ZERO-PAGE WITH
ZERO-PAGE ADDRESSING.
╤ $09─) ╚OW MANY ├╨╒ CLOCK SIGNAL LINES DOES THE 650╪ REQUIRE TO RUN?
┴ $09─) 1. ╘HE 6501 USED TWO, AS THE 6800 USED TWO, BUT THE 6502 AND
SUCCESSORS ONLY REQUIRED ╨HI0 (╨HI1). ╨HI2 WAS GENERATED ON THE ├╨╒.
╤ $09┼) ╫HERE DOES THE 650╪ LINE FETCH ITS FIRST BYTE FROM AFTER RESET?
┴ $09┼) $FFFC. ╘HE ADDRESS FORMED BY READING $FFFD AND $FFFC IS STUFFED INTO
THE ╔╨, AND THE CODE IS READ STARTING THERE. $FFFC IS READ FIRST,
SINCE THE 65╪╪ LINE STORES ADDRESSES IN LOW BYTE, HIGH BYTE FORMAT.
╤ $09╞) ╧NE OF THE ORIGINAL DESIGNERS ON THE ╬═╧╙ 6502 ├╨╒ NOW HEADS UP
╫ESTERN ─ESIGN ├ENTER IN ┴RIZONA, AND MAKES THE 65├02 AND 65├816
├╨╒ CHIPS. ╬AME HIM. ╚INT: IT IS NOT ├HUCK ╨EDDLE!
┴ $09╞) ┬ILL ═ENSCH. ╚E HAND-DESIGNED THESE NEWER PARTS IN THE 65╪╪ LINE
IN THE SAME MANNER HE AND ├HUCK ╨EDDLE AND OTHERS HAND-DESIGNED THE
6501 AND 6502.
╚ERE ARE THE ANSWERS TO ├OMMODORE ╘RIVIA ┼DITION #11 FOR ╧CTOBER, 1994
╤ $0┴0) ╔N THE MID 1980'S, ├OMMODORE INTRODUCED ╥┴═ ┼XPANSION ╒NITS FOR THE
├OMMODORE 64, 64├, 128, AND 128─. ╘HERE WERE THREE OF THEM. ╟IVE
THEIR MODEL NUMBERS, AND WHAT WAS DIFFERENT AMONG THEM.
┴ $0┴0) ╘HE 1700 (128K┬), THE 1764 (256K┬), AND THE 1750 (512K┬). ╘HE
1700 AND THE 1750 WERE MARKETED FOR THE 128, WHILE THE 1764 WAS
MARKETED FROM THE 64 LINE.
╤ $0┴1) ╙OME OF THE ├╔┴ INTEGRATED CIRCUITS USED ON THE ├64 AND ├128
COMPUTERS HAVE A HARDWARE DEFECT. ╫HAT IS THE RESULT OF THIS
DEFECT, AND WHEN DOES IT OCCUR? (═AY BE MORE THAN ONE, BUT ╔ NEED
ONLY ONE)
┴ $0┴1) ╘HE ONLY ONE ╔ HAVE DOCUMENTED IN FRONT OF ME IS THE TIMER ┬
INTERRUPT BUG, WHICH IS EXPLAINED IN THE "╘OWARD 2400" ARTICLE
BY ╟EORGE ╚UG IN ╘RANSACTOR 9.3. (1) ╚OWEVER, ╔ HAD MANY PEOPLE
RELATE OTHER BUGS (2 AND 3), WHICH ╔ HAVEN'T BEEN ABLE TO TEST, SO ╔
ADD THEM AS POSSIBILITIES. (╔ ENCOURAGE READERS TO CONFIRM/DENY THE
LATTER 2.)
1) ╔F TIMER ┬ OF THE 6526 ├╔┴ TIMES OUT AT ABOUT THE SAME TIME AS A
READ OF THE INTERRUPT REGISTER, THE TIMER ┬ FLAG MAY NOT BE SET AT
ALL, AND NO INTERRUPT WILL OCCUR IF TIMER ┬ INTERRUPTS WERE
TURNED ON.
2) ╫HEN THE HOUR ON THE ╘╧─ CLOCK IS 12, THE ┴═/╨═ MUST BE REVERSED
FROM ITS NORMAL SETTING TO SET/RESET THE ┴═/╨═ FLAG.
3) ╘HE ╘╧─ CLOCK SOMETIMES GENERATES DOUBLE INTERRUPTS FOR ALARM
TRIGGER.
╤ $0┴2) ╬AME THE ├OMMODORE MACHINE(S) ON WHICH A ╔NTEL 8088 WAS AN ╧╨╘╔╧╬┴╠
COPROCESSOR. (╚INT, NOT THE ╔┬═ CLONES)
┴ $0┴2) ╔ WAS LOOKING FOR THE ┬ SERIES COMPUTERS, WHICH CONTAINS THE ┬
COMPUTERS (┬128, ┬256), AS WELL AS THE 600 SERIES AND THE 700
SERIES. ╘HESE COMPUTERS COULD BE FITTED WITH AN OPTIONAL 8088
PROCESSOR ON A SEPARATE CARD. ╚OWEVER, ANOTHER CORRECT ANSWER IS
THE ┴MIGA, WHICH CAN HAVE A 8088 ATTACHED VIA AN EXPANSION CARD OR A
╙IDE├AR(TM) UNIT.
╤ $0┴3) ╧N ├OMMODORE COMPUTERS BESIDE THE ╨LUS/4 SERIES, THERE ARE THREE
FREQUENCIES USED TO RECORD THE DATA ON THE TAPE. ╬AME THE
FREQUENCIES USED.
┴ $0┴3) 1953.125╚Z, 2840.909╚Z, AND 1488.095╚Z. ╘HESE CORRESPOND TO
WAVEFORMS WITH PERIODS: 512US, 352US, AND 672US, RESPECTIVELY.
╤ $0┴4) ├OMMODORE ╨LUS/4 SERIES COMPUTERS CAN NOT READ ANY CASSETTES
RECORDED ON OTHER ├OMMODORE COMPUTERS. ╫HY? (╚INT: ╔T HAS
NOTHING TO DO WITH THE NONSTANDARD CONNECOTR ON THE ╨LUS/4)
┴ $0┴4) ╘HE TONES RECORDED ON THE ╨LUS/4-├16 ARE EXACTLY ONE-HALF THE
FREQUENCIES SHOWN ABOVE. ╘HIS SUGGESTS TO MANY THAT THE ╨LUS/4
AND ├16 WERE SUPPOSED TO RUN AT TWICE ITS PRESENT FREQUENCY,
BUT WERE DOWNGRADED AT THE LAST-MINUTE, AND THE CODE TO GENERATE
THE TONES WAS NOT UPDATED TO REFLECT THE CHANGE. ╘HIS IS JUST
HERESAY, SO YOU DECIDE FOR YOURSELF.
╤ $0┴5) ─URING POWER-UP, THE ├OMMODORE 64 CHECKS TO SEE IF IT RUNNING
IN ╨┴╠-LAND OR ╬╘╙├-LAND. ╚OW DOES IT DETERMINE ITS LOCATION?
┴ $0┴5) ╔T SETS THE RASTER COMPARE INTERRUPT TO GO OFF AT SCAN LINE 311.
╔F THE INTERRUPT OCCURS, WE ARE ON A ╨┴╠ SYSTEM, SINCE ╬╘╙├ WILL
NEVER GET TO LINE 311 (╬╘╙├ ONLY HAS 262.5 LINES PER FRAME, EVERY
OTHER FRAME SHIFTED DOWN A BIT TO CREATE 525 LINES).
╤ $0┴6) ╫HAT IS THE 65╪╪ ═╠ OPCODE FOR ┬╥╦?
┴ $0┴6) $00, OR 00
╤ $0┴7) ╧N THE 65╪╪ ├╨╒, WHAT GETS PUSHED ONTO THE STACK WHEN AN INTERRUPT
OCCURS?
┴ $0┴7) ╘HE PROGRAM COUNTER GETS SAVED HIGH BYTE FIRST, THEN THE PROCESSOR
STATUS FLAGS GET SAVED.
╤ $0┴8) ╙PEAKING OF THE STACK, WHERE IS THE STACK LOCATED IN THE 65╪╪ ADDRESS
MAP?
┴ $0┴8) $0100 TO $01╞╞
╤ $0┴9) ╧N THE 65╪╪ ├╨╒ LINE, IT IS POSSIBLE TO SET AND CLEAR A NUMBER OF
PROCESSOR STATUS FLAGS. ┼XAMPLES INCLUDE ╙┼├ AND ├╠├ TO SET AND
CLEAR THE CARRY FLAG. ╫HAT FLAG HAS A CLEAR OPCODE, BUT NO SET
OPCODE?
┴ $0┴9) ╘HE OVERFLOW FLAG: ╓. ╚OWEVER, THE ╓ FLAG CAN BE SET VIA AN EXTERNAL
PIN ON SOME MEMBERS OF THE 65╪╪ LINE. ╘HE 1541 USES THIS AS AN
INGENIOUS SYNCHRONIZATION TOOL.
╤ $0┴┴) ╫HEN SAVING A TEXT FILE TO TAPE, THE COMPUTER RECORDS 192 BYTES OF
DATA, AN INTER-RECORD GAP, AND THEN THE SAME 192 BYTES OF DATA
AGAIN. ╚OW WIDE IS THIS INTER-RECORD GAP, AND WHY IS IT THERE?
┴ $0┴┴) ╙OME TERMINOLOGY: "INTER" MEANS "BETWEEN". ═OST EVERYONE KNOWS
THAT A TAPE BLOCK IS RECORDED TWICE ON THE TAPE, BUT ├OMMODORE
CONSIDERS THE TWO COPIES AND THE GAP BETWEEN THEM A SINGLE
"RECORD". ╘HUS, THIS QUESTION IS REFERRING TO THE GAP IN BETWEEN
TWO DISSIMILAR RECORDS. ╫ITH THAT IN MIND,
THE INTERRECORD GAP IS NOMINALLY 2 SECONDS LONG, (OR 223.2 BYTE
LENGTHS, ALTHOUGH THE GAP CONTAINS NO DATA). ╔T IS THERE TO ALLOW
THE TAPE MOTORS TO GET UP TO SPEED BEFORE THE NEXT DATA COMES UNDER
THE READ/WRITE HEAD. ╘HE TAPE MOTORS MAY NEED TO STOP BETWEEN
RECORDS IF THE PROGRAM IS NOT REQUESTING ANY MORE DATA FROM THE
TAPE DATA FILE AT THIS TIME. ╔F THE PROGRAM SUBSEQUENTLY ASKS
FOR DATA FROM THE TAPE, THE DRIVE MUST GET UP TO SPEED BEFORE THE
READ CAN OCCUR. ╬OTE: ON THE FIRST VERSION OF ╨┼╘ ┬┴╙╔├, THE
GAP WAS TOO SMALL, SO PROGRAMMERS HAD PROBLEMS RETRIEVING DATA
FILES.
╞OR COMPLETENESS, THE "INTRA-RECORD" GAP (╘HE ONE BETWEEN THE TWO
COPIES OF THE DATA) CONSISTS OF 50+ SHORT PULSES, EACH OF WHICH IS
352US IN LENGTH, GIVING A TIMING OF .0176S+. ╘HIS TIME WAS USED TO
COPY IMPORTANT DATA TO SAFE LOCATIONS, RESET POINTERS, AND DO ERROR
LOGGING. ╘HE ENTIRE "RECORD" IS RECORDED IN 5.7 SECONDS.
╤ $0┴┬) ╧N AN UNEXPANDED ╓╔├-20, WHERE DOES THE SCREEN MEMORY START?
┴ $0┴┬) $1E00, OR 7680
╤ $0┴├) ╔N ├OMMODORE ┬┴╙╔├, WHAT IS THE ABBREVIATED FORM OF THE "╠OAD"
COMMAND?
┴ $0┴├) L╧ (╠ ╙╚╔╞╘-╧)
╤ $0┴─) ╔N ├OMMODORE ┬┴╙╔├, WHAT IS THE ABBREVIATED FORM OF THE "╠IST"
COMMAND?
┴ $0┴─) L╔ (╠ ╙╚╔╞╘-╔)
╤ $0┴┼) ╧N THE ├OMMODORE 64, THERE IS SECTION OF 4 KILOBYTES OF ╥┴═ THAT
CANNOT BE USED FOR ┬┴╙╔├ PROGRAMS. ╔T IS THE FAVORITE HIDING
PLACES FOR MANY ═╠ PROGRAMS, HOWEVER. ╫HAT IS ITS ADDRESS IN
MEMORY?
┴ $0┴┼) $C000, OR 49152
╤ $0┴╞) ╫HAT IS STORED AT LOCATIONS $┴004-$┴00┬, AND WHY IS IT STRANGE?
┴ $0┴╞) ╘HE TEXT "├┬═┬┴╙╔├" IS STORED THERE. ╔T IS STRANGE BECAUSE THIS
TEXT IS NOT REFERENCED BY ANY ROUTINE. ╔T CAN ALSO BE CALLED
STRANGE BECAUSE THE CODE IS ═ICROSOFT'S. ─OESN'T IT MAKE YOU WONDER?
╚ERE ARE THE ANSWERS TO ├OMMODORE ╘RIVIA ┼DITION #12 FOR ╬OVEMBER, 1994
╤ $0┬0) ╫HAT WILL HAPPEN IF YOU TYPE ?""+-0 INTO THE ├┬═ ┬┴╙╔├ INTERPRETER
ON THE ╨┼╘ SERIES, THE 64 SERIES, OR THE 128 SERIES?
┴ $0┬0) ╘HE ┬┴╙╔├ INTERPRETER HAS A BUG IN IT THAT SHOWS UP WHILE INTERPRETING
THE ABOVE STATEMENT. ╘HE INTERPRETER LEAVES TWO BYTES ON THE ├╨╒
STACK PRIOR TO RETURNING FROM A SUBROUTINES CALL. ┴T LEAST ON THE
├64, THE TWO BYTES ARE BOTH ZEROS. ╙INCE SUBROUTINES PUT THE RETURN
ADDRESS ON THE STACK, THE RETURN RETRIEVES THE TWO BYTES LEFT ON THE
STACK AND ATTEMPTS TO SE THAT AS THE RETURN ADDRESS. ╙O, DEPENDING ON
WHAT CODE IT EXECUTES AFTER THE RETURN, IT CAN DO A NUMBER OF THINGS.
═OST OF THE TIME AFTER THE BUG OCCURS, THE INTERPRETER LIMPS ALONG
FOR A WHILE UNTIL IT HITS A ┬╥╦ INSTRUCTION, $00. ╘HEN, THAT
INSTRUCTION CAUSES THE SYSTEM TO EXECUTE AN INTERRUPT. ╧N THE ├64,
THE SYSTEM VECTORS THROUGH $316-$317 (┬╥╦ VECTOR) AND DOES A WARM
START. ╧N THE ├128 AND ╨┼╘S WITH ═ONITORS, THE SYSTEM DUMPS INTO THE
INTERNAL MACHINE LANGUAGE MONITOR. ╔F THE MACHINE UNDER USE DID NOT
DO SOMETHING WITH THE ┬╥╦ VECTOR, THE MACHINE WILL HANG.
╬OW, NOTE THAT THE ABOVE IS NOT THE ONLY RESULT. ╙INCE THE
INTERPRETER IS EXECUTING CODE FROM THE WRONG LOCATION, ANY RESULT
FROM NO EFFECT TO HUNG MACHINE IS POSSIBLE.
╬OTE THAT THIS IS ╬╧╘ NORMAL BEHAVIOR. ╘HE SYSTEM SHOULD REPORT AN
ERROR WHILE INTERPRETING THE ABOVE STATEMENT.
╤ $0┬1) ╔N THE FIRST ├┬═ 64 UNITS, WHAT COLOR WAS THE SCREEN COLOR ╥┴═
CHANGED TO WHEN YOU CLEARED THE SCREEN?
┴ $0┬1) ╘HE SCREEN COLOR ╥┴═ WAS CHANGED TO VALUE 1 WHEN THE SCREEN WAS
CLEARED. ╘HUS, WHEN A BYTE WAS POKED INTO SCREEN ╥┴═, THE RESULTING
CHARACTER WAS WHITE ON THE SCREEN. ╘HE WHITE CONTRASTED NICELY
WITH THE NORMAL BLUE BACKGROUND.
╤ $0┬2) ╫HY WAS IT CHANGED IN LATER VERSIONS OF THE 64?
┴ $0┬2) ├OMMODORE FOUND THAT THIS PRACTICE SOMETIMES CAUSED "LIGHT FLASHES"
DURING SCREEN SCROLLS. ╔ WAS GOING TO LEAVE THIS FOR ANOTHER TIME,
BUT ... ╘HE CHANGE WAS TO MAKE THE COLOR ╥┴═ EQUAL TO BACKGROUND
COLOR REGISTER #0. ╫ELL, THIS GOT RID OF THE "LIGHT FLASHES", BUT
THEN POKING VALUES TO SCREEN ╥┴═ CAUSED INVISIBLE CHARACTERS, SINCE
THE FOREGROUND COLOR OF THE CHARACTER WAS THE SAME AS THE BACKGROUND
COLOR OF THE SCREEN.
╫ELL, THIS BROKE A NUMBER OF OLDER PROGRAMS THAT DID NOT
PROPERLY INITIALIZE THE COLOR ╥┴═. ┴LSO, ├OMMODORE FIXED THE PROBLEM
WITH THE ╓╔├-╔╔ THAT HAD CAUSED THESE "LIGHT FLASHES" ╙O, ├OMMODORE
CHANGED THE ╦┼╥╬┴╠ A THIRD TIME. ╙INCE THE ABOVE CHANGE CAUSED
INVISIBLE CHARACTERS, ├OMMODORE MADE A THIRD REVISION THAT CHANGED
THE COLOR ╥┴═ TO THE VALUE IN LOCATION 646 (THE CURRENT CURSOR
FOREGROUND COLOR).
╤ $0┬3) ╫HAT IS "SPECIAL" ABOUT THE TEXT THAT DISPLAYS THE "ILLEGAL QUANTITY
ERROR" IN ├┬═ ┬┴╙╔├?
┴ $0┬3) ╘HE TEXT IS ACTUALLY "?╔╠╠┼╟┴╠ ╤╒┴╬╘╔╘┘ ┼╥╥╧╥". ╬OTICE THE TWO
SPACES BETWEEN "╤╒┴╬╘╔╘┘" AND "┼╥╥╧╥". ╩OHN ╫EST SUPPLIES THE
EXPANANTION:
"╘HE VECTOR AT $0300 POINTS TO A ROUTINE AT $┴43┴, WHICH IS THE
GENERAL ERROR MESSAGE PRINTING ROUTINE. ╠OAD .╪ WITH THE NUMBER OF
THE ERROR, AND IT PRINTS IT. IT LOOKS UP THE ADDRESS OF THE ERROR
TEXT FROM A TABLE, THEN PRINTS THE TEXT, WHICH DOES NOT HAVE ANY
TRAILING SPACES. ╔T THEN PRINTS ' ┼╥╥╧╥', WITH *2* SPACES. ╔T
DOES THIS FOR ALL ERRORS."
╚ISTORICALLY, THIS EFFECT IS CAUSED BY THE ╓╔├-20, WHICH ONLY HAD 22
COLUMNS. ╫HEN THE ╓╔├-20 ┬┴╙╔├ WAS BEING PORTED FROM THE ╨┼╘ ┬┴╙╔├
CODE, SOMEONE NOTICED THAT THE SOME OF THE ERROR STRINGS WOULD
SPAN TWO ╓╔├-20 LINES. ╙O, THE ┬┴╙╔├ ERROR MESSAGES WERE CHANGED
A LITTLE, SO THAT THEY ALL PRINTED NEATLY ON TWO LINES: ╘HE ╨┼╘
ERROR STRING:
?╔╠╠┼╟┴╠ ╤╒┴╬╘╔╘┘ ┼╥╥╧╥ (ONE SPACE) BECAME:
?╔╠╠┼╟┴╠ ╤╒┴╬╘╔╘┘
┼╥╥╧╥ (CARRIAGE RETURN PLUS ONE SPACE).
╫HEN THE ├64 ┬┴╙╔├ WAS BEING PORTED FROM THE ╓╔├-20, THE CARRIAGE
RETURN WAS REPLACED WITH A SPACE CHARACTER.
╔ ADMIT THIS CAUGHT ME BY SURPRISE. ╔ HAVE USED ├OMMODORE COMPUTERS
FOR YEARS, AND NEVER NOTICED THAT "?╙┘╬╘┴╪ ┼╥╥╧╥" HAD 2 SPACES IN IT.
╤ $0┬4) ╧N WHAT ├OMMODORE MACHINE WAS THE OPERATING SYSTEM ╧╙/9 AVAILABLE?
┴ $0┬4) ╙INCE ╧╙/9 WAS A REAL-TIME OPERATING SYSTEM FOR THE 6809
MICROPROCESSOR, IT WAS AVAILABLE ON ONLY ONE ├OMMODORE MACHINE, WHICH
HAD TWO DIFFERENT NAMES: ╘HE ├OMMODORE ╙UPER╨┼╘. ╘HE MACHINE WAS
SOLD AS THE "══╞ (═ICRO ═AIN╞RAME) 9000 IN ╟ERMANY, AND ITS MODEL
NUMBER WAS ╙╨9000.
╤ $0┬5) ╫HICH ├OMMODORE MACHINE(S) DOES NOT HAVE A USER PORT?
┴ $0┬5) ╘HERE WERE A NUMBER OF ANSWERS TO THIS QUESTION, AND THERE MAY BE
MORE:
╘HE ├OMMODORE ├16. ├OMMODORE DECIDED TO CUT OUT TELECOMMUNICATIONS,
AND THUS DESIGNED THE USER PORT OUT OF THE COMPUTER, AS THE MODEM IS
THE ONLY USE ├OMMODORE EVER MADE OF THE USER PORT. ╘HIS ALSO
INCLUDES THE ├116, A VERSION OF THE ├16 WITH A CHICKLET KEYBOARD.
╘HE ├OMMODORE ╒LTIMAX/═┴╪ MACHINE. ╘HIS WAS THE ILL-FATED GAME
CONSOLE PRODUCED IN THE EARLY 80S. ╔T WAS BASICALLY A STRIPPED DOWN
├OMMODORE 64.
╘HE 64 ╟╙ (╟AME ╙YSTEM). ╘HIS MACHINE WAS ANOTHER FLOP PRODUCED
IN THE LATE 80S.
╤ $0┬6) ╚OW MANY PINS ARE THERE IN A ├OMMODORE ╙ERIAL ├ONNECTOR?
┴ $0┬6) 6.
╤ $0┬7) ╘HERE ARE 13 ADDRESSING MODES AVAILABLE ON THE 6502. ╬AME THEM.
┴ $0┬7) ╬O# ╬AME ─ESCRIPTION
--- ------------ -----------
01) ACCUMULATOR ASL A
02) IMMEDIATE LDA #$00
03) ZERO PAGE LDA $00
04) ZERO PAGE,╪ LDA $00,╪
05) ZERO PAGE,┘ LDA $00,┘
06) ABSOLUTE LDA $1000
07) ABSOLUTE,╪ LDA $1000,╪
08) ABSOLUTE,┘ LDA $1000,┘
09) IMPLIED CLC
10) RELATIVE BNE
11) (INDIRECT,╪) LDA ($00,╪)
12) (INDIRECT),┘ LDA ($00),┘
13) (ABSOLUTE INDIRECT) JMP ($1000)
╤ $0┬8) ╔F YOU WERE TO PUT ONE LARGE SEQUENTIAL FILE ONTO AN 8050 DISK DRIVE,
HOW BIG COULD THAT FILE BE?
┴ $0┬8) ┴CCORDING TO THE 8050 ╒SER ═ANUAL, A SEQUENTIAL FILE COULD BE
521208 BYTES IN SIZE.
╤ $0┬9) ╚OW MANY CHARACTERS CAN BE PRESENT IN A STANDARD ├OMMODORE ─╧╙
FILENAME?
┴ $0┬9) 16 CHARACTERS.
╤ $0┬┴) ╚OW MANY PINS DOES A 6502 ╔├ HAVE ON IT?
┴ $0┬┴) 40 PINS.
╤ $0┬┬) ╚OW MANY PINS DOES THE STANDARD ╔┼┼┼-488 CONNECTOR HAVE ON IT?
┴ $0┬┬) 24 PINS.
╤ $0┬├) ╧N THE ╔┼┼┼-488 BUS, WHAT DOES THE ACRONYM FOR PIN 7, ╬╥╞─, STAND FOR?
┴ $0┬├) ╬OT ╥EADY ╞OR ─ATA.
╤ $0┬─) ╧N THE ╬═╧╙ 6502, WHAT IS THE ═╠ OPCODE FOR ╙┼─, AND WHAT DOES THIS
OPCODE DO?
┴ $0┬─) $F8, ╙┼T ─ECIMAL MODE. ╙ETS THE ─ FLAG IN THE STATUS FLAGS BYTE.
┴LTHOUGH USED RARELY, THIS OPCODE SWITCHES ON ┬INARY ├ODED ─ECIMAL
MODE. ╔N ┬├─ MODE, THE BYTE $10 IS TREATED AS 10, NOT 16. ╘HE ADD
AND SUBTRACT INSTRUCTIONS ARE THE ONLY LEGAL ONES AFFECTED BY THIS
MODE, ALTHOUGH SOME UNDOCUMENTED/ILLEGAL OPCODES ARE ALSO AFFECTED.
╞OR EXAMPLE, IN THIS MODE, ADDING THE BYTE $15 (21) TO THE BYTE $25
(37) YIELDS $40 (64) NOT $3A (58). EMEMBER THAT, IN THIS MODE,
$40 = 40, NOT 64.
╤ $0┬┼) ┴SSUMING A ╨┼╘ COMPUTER AND A NON-╨┼╘ COMPUTER HAVE ACCESS TO A
COMMON DISK DRIVE OR TAPE DRIVE, THERE ARE TWO WAYS TO LOAD A ╨┼╘
┬┴╙╔├ PROGRAM ON THE NON ╨┼╘ ├┬═ COMPUTER. ╬AME THEM.
┴ $0┬┼) ═OST DIFFERING SERIES OF ├OMMODORE COMPUTERS HAD DIFFERENT PLACES
FOR THE START OF ┬┴╙╔├ PROGRAMS. ╞OR INSTANCE, ON THE ├64, $0801
(2049) IS THE START OF ┬┴╙╔├ MEMORY, BUT MOST ╨┼╘ COMPUTERS START
┬┴╙╔├ MEMORY AT $0401 (1025). ╘HIS WOULDN'T MATTER, EXCEPT THAT
┬┴╙╔├ PROGRAMS ARE STORED ON TAPE AND DISK WITH THE START ADDRESS,
AND THE LINE LINKS IN A ┬┴╙╔├ PROGRAM HAVE ABSOLUTE ADDRESSES IN THEM.
╘O FIX THESE PROBLEMS, THE ├OMMODORE ╓╔├-20 AND NEWER COMPUTERS CAME
OUT WITH A "RELOCATABLE LOAD". ╙O, HERE ARE THE TWO CHOICES:
1) ╙AVE THE PROGRAM ON THE ╨┼╘ LIKE SO: SAVE "NAME",╪ (╪ IS DEVICE).
╘HEN, YOU COULD LOAD THE PROGRAM INTO THE NON-╨┼╘ MACHINE
BY USING A RELOCATABLE LOAD: LOAD "NAME",╪. ╘HIS WOULD LOAD THE
PROGRAM IN AT START OF ┬┴╙╔├ MEMORY AND REFIGURE THE LINE LINKS.
2) ╥EDEFINE START OF ┬┴╙╔├ MEMORY ON NON-╨┼╘ MACHINE. ┴ COUPLE
OF POKES TO RELEVANT ┬┴╙╔├ POINTERS, AND THE START OF ┬┴╙╔├
WAS MOVED. ╘HEN, LOAD THE PROGRAM NON-RELOCATABLE.
╬OW, FROM THE ABOVE DISCUSSION, IT LOOKS LIKE OPTION 1 IS THE
SIMPLEST ROUTE. ╫ELL, IT WOULD BE, EXEPT FOR ONE SMALL DETAIL:
┼ARLIER ╨┼╘ COMPUTERS SAVED THE ┬┴╙╔├ PROGRAM FROM $0400, NOT
$0401 AS IS EXPECTED. ╘HE EFFECT: LOADING RELOCATABLE ON A NON-╨┼╘
WOULD HAVE A ZERO BYTE AS THE FIRST BYTE OF THE PROGRAM. ╘HE QUICK
FIX: CHANGE ┬┴╙╔├ POINTER TO ITSELF-1, LOAD ╨┼╘ PROGRAM, RESET
┬┴╙╔├ POINTER. ├OMMODORE DIDN'T MAKE IT EASY!
╤ $0┬╞) ╧NLY ONE OF THE WAYS DETAILED IN $0┬┼ WORKS THE OTHER WAY AROUND.
╫HICH ONE?
┴ $0┬╞) ╙INCE THE EARLIER ╨┼╘ COMPUTERS DID NOT HAVE A "RELOCATABLE LOAD",
THE ONLY WAY TO LOAD A PROGRAM FROM, SAY, A ├64 INTO AN 2001 WAS TO
USE OPTION #2 ABOVE AND MOVE THE START OF ┬┴╙╔├ MEMORY TO $0801
(2049).
├OMMODORE ╘RIVIA ┼DITION #13
╤ $0├0) ╘HE EARLY 1541 DRIVES USED A MECHANISM DEVELOPED BY ______. ╬AME
THE COMPANY.
╤ $0├1) ╧N LATER MODELS, ├OMMODORE SUBSEQUENTLY CHANGED MANUFACTURERS
FOR THE 1541 DRIVE MECHANISM. ╬AME THE NEW MANUFACTURER.
╤ $0├2) ╫HAT IS THE MOST OBVIOUS DIFFERENCE(S). (╧NLY ONE DIFFERENCE IS
NECESSARY)
╤ $0├3) ╧N ├OMMODORE ┬┴╙╔├ ╓2.0, WHAT ANSWER DOES THE FOLLOWING GIVE:
╨╥╔╬╘ (╙╤╥(9)=3)
╤ $0├4) ╔N ├OMMODORE ┬┴╙╔├ (┴NY VERSION) WHAT DOES ┬ EQUAL AFTER THE FOLLOWING
RUNS: ├=0:┬=├=0
╤ $0├5) ╘HE FIRST ╨┼╘ CASSETTE DECKS WERE ACTUALLY _______ BRAND CASSETTE
PLAYERS, MODIFIED FOR THE ╨┼╘ COMPUTERS. ╬AME THE COMAPNY.
╤ $0├6) ╔N ├OMMODORE ┬┴╙╔├ (┴NY VERSION), WHAT HAPPENS IF THE FOLLOWING
PROGRAM IS RUN:
10 ╩=0
20 ╔╞ ╩=0 ╟╧ ╘╧ 40
30 ╨╥╔╬╘ "╩<>0"
40 ╨╥╔╬╘ "╩=0"
╤ $0├7) ╔N QUESTION $068, WE LEARNED HOW ╩ACK ╘RAMIEL FIRST HAPPENED UPON THE
NAME "├╧══╧─╧╥┼". ┴CCORDING TO THE STORY, THOUGH, IN WHAT COUNTRY
WAS HE IN WHEN HE FIRST SAW IT?
╤ $0├8) ╧N THE ├OMMODORE USER PORT CONNECTOR, HOW MANY EDGE CONTACTS ARE
THERE?
╤ $0├9) ╧N MOST ├OMMODORE COMPUTERS, A LOGICAL ┬┴╙╔├ LINE CAN CONTAIN UP TO
80 CHARACTERS. ╧N WHAT ├OMMODORE COMPUTER(S) IS THIS NOT TRUE?
╤ $0├┴) ╔F A FILE IS SAVED TO A ├OMMODORE ─ISK ─RIVE WITH THE FOLLOWING
CHARACTERS: CHR$(65);CHR$(160);CHR$(66), WHAT WILL THE DIRECTORY
ENTRY LOOK LIKE?
╤ $0├┬) ╫HAT IS THE MAXIMUM LENGTH (IN CHARACTERS) OF A ├┬═ DATASETTE
FILENAME?
╤ $0├├) ╚OW MANY KEYS ARE ON A STOCK ├OMMODORE 64 KEYBOARD?
╤ $0├─) ├OMMODORE ┬┴╙╔├ USES KEYWORD "TOKENS" TO SAVE PROGRAM SPACE. ╘OKEN
129 BECOMES "╞╧╥". ╫HAT TWO TOKENS EXPAND TO INCLUDE A LEFT
PARENTHESIS AS WELL AS A ┬┴╙╔├ KEYWORD?
╤ $0├┼) ╘HERE ARE 6 WIRES IN THE ├OMMODORE SERIAL BUS. ╬AME THE 6 WIRES.
╤ $0├╞) ╧N THE ├OMMODORE DATASETTE CONNECTOR, HOW MANY LOGICAL CONNECTIONS ARE
THERE?
╙OME ARE EASY, SOME ARE HARD, TRY YOUR HAND AT:
├OMMODORE ╘RIVIA ┼DITION #13!
╩IM ┬RAIN
BRAIN@MAIL.MSEN.COM
602 ╬ORTH ╠EMEN (╬EW ADDRESS)
╞ENTON, ═╔ 48430
(810) 737-7300 X8528
==============================================================================
┴ ─IFFERENT ╨ERSPECTIVE, PART ╔╔
BY ╟EORGE ╘AYLOR (AA601@CFN.CS.DAL.CA) AND ╙TEPHEN ╩UDD (SJUDD@NWU.EDU).
╫E... ARE... ╓╥ ╘ROOPERS! ╧KAY ╘ROOPERS, ONCE AGAIN WE NEED TO MAKE AN
EXCURSION OUT OF THE THREE DIMENSIONAL WORLD AND INTO OUR OWN LITTLE VIRTUAL
WORLD INSIDE THE ├64. ╙O SIT BACK IN YOUR VIRTUAL CHAIR, PUT ON YOUR VIRTUAL
THINKING HELMET, MAYBE GRAB A VIRTUAL BEER, AND PREPARE FOR A VIRTUALLY
USEFUL EXPERIENCE WITH ANOTHER VIRTUALLY HUMONGOUS ARTICLE.
╠AST TIME WE LAID DOWN THE FOUNDATIONS OF 3─ GRAPHICS: ROTATIONS AND
PROJECTIONS. ╔N THIS ARTICLE WE WILL BUILD UPON THIS FOUNDATION WITH A LOOK
AT HIDDEN SURFACES AS WELL AS FILLED SURFACES. ╔N ADDITION WE WILL SNAZ UP
THE OLD PROGRAM SO THAT IT IS A LITTLE MORE EFFICIENT BY FOR INSTANCE
INTRODUCING A MUCH FASTER MULTIPLICATION ROUTINE AND MOVING ALL VARIABLES
INTO ZERO-PAGE.
╘O GET US IN THE MOOD LET'S REVIEW FROM LAST TIME. ╫E ARE IN A
THREE-DIMENSIONAL SPACE; IN PARTICULAR, A RIGHT-HANDED THREE-DIMENSIONAL
SPACE, SO THAT THE X-AXIS COMES TOWARDS YOU, THE Y-AXIS INCREASES TO THE
RIGHT, AND THE Z-AXIS INCREASES "UP". ╬OW WE HAVE SOME OBJECT, CENTERED AT
THE ORIGIN.
╘O ROTATE THE OBJECT WE DERIVED A 3X3 MATRIX FOR EACH AXIS WHICH DESCRIBES A
ROTATION ABOUT THAT AXIS. ┴FTER ROTATING WE TRANSLATE THE OBJECT ALONG THE
Z-AXIS AND THEN PROJECT IT THROUGH THE ORIGIN ONTO A PLANE Z=CONSTANT.
┴S YOU RECALL THE PROJECTION OF A POINT IS DONE BY DRAWING A LINE FROM THE
POINT THROUGH THE ORIGIN, AND THEN FIGURING OUT WHERE THIS LINE INTERSECTS
OUR PLANE Z=CONSTANT. ┘OU CAN THINK OF THIS LINE AS A RAY OF LIGHT BOUNCING
OFF THE OBJECT AND THROUGH OUR LITTLE PINHOLE CAMERA LENS.
├LEARLY FOR ANY SOLID OBJECT SOME PARTS OF THE OBJECT WILL REMAIN HIDDEN,
THOUGH, I.E. WHEN YOU LOOK AT YOUR MONITOR YOU CAN'T SEE THE BACK OF IT, AND
YOU PROBABLY CAN'T SEE THE SIDES. ╚OW DO WE CAPTURE THIS BEHAVIOR
MATHEMATICALLY?
╚IDDEN ╙URFACES
---------------
╔MAGINE OUR OBJECT WITH SOME LIGHT SHINING ON IT -- WHEN WILL A PART OF THE
OBJECT BE HIDDEN? ├LEARLY IT IS HIDDEN WHEN THE LIGHT REFLECTED OFF OF IT
NEVER REACHES OUR EYES, WHICH HAPPENS WHENEVER A PART OF THE OBJECT IS
"TURNED AWAY" FROM US. ╚OW DO WE EXPRESS THIS MATHEMATICALLY? ├ONSIDER A
FLAT PLATE, LIKE YOUR HAND (YOU ALSO MIGHT THINK OF A CUBE). ╬OW IMAGINE A
ROD STICKING OUT OF THE PLATE, EXACTLY PERPENDICULAR TO THE PLATE (TAKE YOUR
INDEX FINGER FROM YOUR OTHER HAND, AND TOUCH IT TO YOUR PALM AT A
NINETY-DEGREE ANGLE). ╬OW ROTATE THE PLATE AROUND, AND IMAGINE THE LIGHT
BOUNCING OFF AND HEADING TOWARDS YOUR EYES.
╬O MATTER WHERE YOU PLACE YOUR HAND IN SPACE, THE VERY LAST POINT AT WHICH IT
IS VISIBLE IS WHEN IT IS EXACTLY PARALLEL TO THE LIGHT RAYS COMING FROM IT TO
YOUR EYES; OR, TO PUT IT ANOTHER WAY, WHEN THE LIGHT RAYS ARE EXACTLY
PERPENDICULAR TO A NORMAL VECTOR TO THE SURFACE (IN THE ABOVE CASE THIS
VECTOR IS EITHER A ROD OR YOUR FINGER). ╔F THE ANGLE BETWEEN THE NORMAL AND
A LIGHT RAY IS LESS THAN NINETY DEGREES, THEN THE SURFACE IS VISIBLE. ╔F
GREATER, THEN THE SURFACE IS INVISIBLE.
┴T THIS POINT YOU MAY BE WONDERING HOW TO FIGURE OUT THE ANGLE BETWEEN TWO
VECTORS. ╔T TURNS OUT WE REALLY DON'T HAVE TO CALCULATE IT AT ALL: INSTEAD
WE USE A VERY IMPORTANT TOOL IN OUR MATHEMATICAL TOOLBOX, THE DOT PRODUCT.
╔F WE HAVE TWO VECTORS V1=(X1,Y1,Z1) AND V2=(X2,Y2,Z2) THEN THE DOT PRODUCT
IS DEFINED TO BE
V1 DOT V2 = X1*Y1 + X2*Y2 + X3*Y3
NOTE THAT THIS IS A _SCALAR_ (I.E. A NUMBER), AND NOT A VECTOR. ┘OU CAN ALSO
SHOW THAT
V1 DOT V2 = ▄V1▄*▄V2▄*COS(THETA)
WHERE ▄ ▄ DENOTES LENGTH AND THETA IS THE ANGLE BETWEEN THE TWO VECTORS.
╙INCE COS(THETA) IS POSITIVE OR NEGATIVE DEPENDING ON WHETHER OR NOT THETA IS
LESS THAN OR GREATER THAN NINETY DEGREES, ALL WE HAVE TO DO IS TAKE THE DOT
PRODUCT AND LOOK AT THE SIGN.
┬UT WE NEED TO UNDERSTAND SOMETHING ABOUT THE DOT-PRODUCT. THETA IS THE
ANGLE BETWEEN TWO VECTORS JOINED AT THEIR BASE; MATHEMATICALLY THE WAY WE ARE
GOING TO DRAW THE LIGHT RAY IS TO DRAW A LINE ╞╥╧═ THE ORIGIN ╘╧ A POINT ON
THE SURFACE. ╔N OUR MODEL ABOVE, WE ARE GOING TO DRAW A LINE FROM YOUR EYES
TO THE PALM OF YOUR HAND AND THEN SLIDE THE NORMAL VECTOR DOWN THIS LINE
UNTIL THE BASE OF THE NORMAL VECTOR TOUCHES YOUR EYE.
╘HE WHOLE POINT OF THIS IS THAT WHEN WE LOOK AT THE DOT PRODUCT WE NEED TO
KEEP IN MIND THAT IF THE DOT PRODUCT IS NEGATIVE, THE FACE IS VISIBLE.
┴LL THAT REMAINS IS TO WRITE DOWN AN EQUATION: LET'S SAY THAT WE'VE ROTATED
THE SURFACE AND KNOW A POINT ╨=(X,Y,Z) ON THE ROTATED SURFACE, AND WE HAVE A
NORMAL VECTOR TO THE SURFACE VN=(VX,VY,VZ). ╞IRST WE NEED TO TRANSLATE DOWN
THE Z-AXIS SO THAT ╨ -> (X,Y,Z-Z0) = ╨ - (0,0,Z0). ╔F WE THEN TAKE THE DOT
PRODUCT WE FIND THAT
╨' DOT VN = (╨ DOT VN) - Z0*VZ
┬UT (╨ DOT VN) IS SIMPLY A CONSTANT: BECAUSE THESE ARE RIGID ROTATIONS THE
LENGTH OF ╨ NEVER CHANGES, PRESUMABLY THE LENGTH OF VN NEVER CHANGES, AND THE
ANGLE BETWEEN THE TWO NEVER CHANGES. ╙O INTRODUCE A CONSTANT ╦ WHERE
╦ = (╨ DOT VN)/Z0
SO THAT ALL WE NEED TO DO IS SUBTRACT THE Z-COMPONENT OF THE NORMAL VECTOR
FROM ╦ AND CHECK IF IT IS POSITIVE OR NEGATIVE: IF NEGATIVE, THE FACE IS
VISIBLE. ╬OTE THAT IF WE TRANSLATE BY AN AMOUNT ╨ + (0,0,Z0) (INSTEAD OF -
(0,0,Z0)) WE SIMPLY ADD THE TWO TOGETHER.
╫E SEEM TO HAVE LEFT SOMETHING OUT HERE: HOW DO WE CALCULATE THE NORMAL
VECTOR VN? ╧NE WAY TO DO IT IS BY USING ANOTHER VECTOR OPERATOR, THE
CROSS-PRODUCT. ╘HE DOT PRODUCT OF TWO VECTORS IS JUST A SCALAR, BUT THE
CROSS PRODUCT OF TWO VECTORS IS ANOTHER VECTOR, PERPENDICULAR TO THE FIRST
TWO.
╘HE MOST COMMON WAY TO VISUALIZE THE CROSS-PRODUCT IS BY USING YOUR RIGHT
HAND: IMAGINE TWO VECTORS IN SPACE, AND PLACE YOUR RIGHT HAND ALONG ONE OF
THEM, WITH YOUR THUMB STICKING OUT. ╬OW CURL YOUR FINGERS TOWARDS THE OTHER
VECTOR. ┘OUR THUMB POINTS IN THE DIRECTION OF THE VECTOR FORMED FROM THE
CROSS-PRODUCT OF THE FIRST TWO. ┘OU CAN EASILY CONVINCE YOURSELF THEN THAT
(┴ X ┬) = -(┬ X ┴), THAT IS, IF YOU REVERSE THE ORDER OF THE CROSS PRODUCT,
YOU GET A VECTOR POINTING IN THE OPPOSITE DIRECTION.
╘HEREFORE, IF WE TAKE ANY TWO VECTORS IN THE FACE (IN PARTICULAR, WE KNOW THE
EDGE OF THE FACE), AND THEN TAKE THEIR CROSS-PRODUCT, WE HAVE A NORMAL
VECTOR.
┬UT BECAUSE WE ARE DEALING WITH A CUBE, WE HAVE AN EVEN EASIER METHOD! ╫E
CAN USE THE FACT THAT THE FACES ON A CUBE ARE PERPENDICULAR TO EACH OTHER: IF
WE TAKE TWO POINTS AND SUBTRACT THEM WE GET A VECTOR GOING BETWEEN THE TWO
POINTS. ╧N A CUBE, THIS WILL GIVE US A NORMAL VECTOR IF WE USE TWO
"OPPOSITE" POINTS. ╘HEREFORE ALL WE NEED TO DO IS ROTATE THE CUBE, SUBTRACT
TWO Z-COORDINATES, ADD TO ╦, AND CHECK IF IT IS POSITIVE OR NEGATIVE.
╘HIS IS HOW THE PROGRAM DOES IT, AND THE SPECIFICS WILL BE EXPLAINED LATER.
╥IGHT NOW ╔ WANT TO SHOW YOU A SECOND METHOD OF HIDDEN SURFACE DETECTION.
╔NSTEAD OF USING THE THREE-DIMENSIONAL ROTATE VECTORS, WHAT IF WE USE THE
TWO-DIMENSIONAL _PROJECTED_ VECTORS? ╔F WE TAKE THE CROSS-PRODUCT OF TWO OF
THESE VECTORS WE GET A VECTOR WHICH EITHER POINTS INTO THE SCREEN OR OUT OF
IT, WHICH CORRESPONDS TO A POSITIVE OR A NEGATIVE RESULT.
╘HE CROSS-PRODUCT IS USUALLY DONE BY TAKING THE DETERMINANT OF A MATRIX. ╔
AM NOT GOING TO EXPLAIN THAT HERE -- YOU CAN LOOK IN ANY DECENT CALCULUS BOOK
FOR THE FULL CROSS-PRODUCT. ┴LL WE REALLY CARE ABOUT IS THE Z-COORDINATE OF
THE VECTOR, AND THE Z-COORDINATE OF V1 X V2 IS:
V1X*V2Y - V1Y*V2X
╫HETHER OR NOT THE FACE IS VISIBLE DEPENDS ON HOW YOU DEFINE V1 AND V2!
┴LWAYS REMEMBER THAT (V1 X V2) = -(V2 X V1).
╫HAT IS THIS QUANTITY ANYWAYS? ├ONSIDER A PARALLELOGRAM MADE UP OF OUR TWO
VECTORS V1 AND V2. ╘HE MAGNITUDE OF THE CROSS-PRODUCT JUST HAPPENS TO BE
▄V1▄*▄V2▄*SIN(THETA)
WHICH YOU CAN EASILY SEE IS THE AREA OF A PARALLELOGRAM WITH SIDES V1 AND V2.
╞OR THIS REASON THE SECOND METHOD APPARENTLY GOES BY THE NAME ╙┴═ -- ╙IGNED
┴REA ═ETHOD. (╬OW YOU NEED TO THINK ABOUT THE INTERPRETATION OF THE DOT
PRODUCT IN A SIMILAR WAY).
╬OTE THAT THE SECOND METHOD IS QUITE GENERAL, WHILE THE FIRST METHOD ONLY
WORKS FOR OBJECTS WHICH HAVE PERPENDICULAR SURFACES (AT LEAST, IN IT'S
CURRENT FORM PRESENTED HERE). ╧N THE OTHER HAND, THE FIRST METHOD IS
SIGNIFICANTLY FASTER.
╬OW THAT WE'VE HIDDEN THE FACES, IT'S TIME TO FILL THEM:
╞ILLED ╞ACES
------------
╤: ╚OW DO YOU MAKE A STATUE OF AN ELEPHANT?
┴: ╙TART WITH A BLOCK OF GRANITE AND CARVE AWAY EVERYTHING
THAT DOESN'T LOOK LIKE ELEPHANT!
╘HE FIRST METHOD OF FILLING FACES IS VERY SIMPLE IN CONCEPT. ╠ET'S SAY WE
WANT A CUBE WITH WHITE FACES AND BLACK EDGES. ┬EFORE, THE PROGRAM WOULD MAKE
THE BUFFER BLACK AND THEN DRAW IN THE WHITE EDGES. ╘HE IDEA HERE IS TO MAKE
THE ENTIRE BUFFER WHITE, DRAW THE EDGES IN BLACK, AND THEN MAKE EVERYTHING
OUTSIDE OF THE EDGES BLACK. ╤UITE SIMPLY, WE START WITH A SOLID BLOCK AND
THEN TAKE AWAY EVERYTHING THAT DOESN'T LOOK LIKE A CUBE! ┘OU CAN ALSO THINK
OF IT LIKE A COOKIE CUTTER: WE PRESS OUR CUBE-SHAPED CUTTER DOWN AND REMOVE
ALL THE DOUGH OUTSIDE OF THE CUTTER.
╘HIS SIMPLISTIC METHOD ACTUALLY HAS SOME ADVANTAGES. ╔F THE OBJECT IS VERY
LARGE, WE SPEND VERY LITTLE TIME DOING THE ACTUAL UN-FILLING. ╫E DON'T CARE
ABOUT HOW COMPLICATED THE OBJECT IS, BECAUSE WE JUST TRACE OUT THE EDGE.
╞INALLY, THIS GIVES US AN EXTREMELY EASY WAY OF IMPLEMENTING A RUDIMENTARY
TEXTURE-MAPPING IN MULTICOLOR MODE. ╞OR INSTANCE, INSTEAD OF COLORING THE
BLOCK WHITE, WHAT IF WE USED A CHANGING PATTERN OF COLORS? ┴S LONG AS THE
EDGE IS A SPECIFIC COLOR, THE PATTERN CAN BE ANY COMBINATION OF THE OTHER
THREE COLORS. ┴N EXAMPLE PROGRAM WHICH DOES JUST THIS IS INCLUDED -- NOTE
THAT THE INITITALIZATION PROGRAM NEEDS TO BE CHANGED SLIGHTLY TO RUN THIS
PROGRAM.
╔N OTHER WORDS, WE ROLL THE DOUGH, DRAW A PATTERN INTO IT, PRESS OUR CUTTER
DOWN AND REMOVE THE OUTSIDE DOUGH. ╫E ARE LEFT WITH A CUBE WITH PATTERNS ALL
OVER IT.
╧N THE DOWNSIDE IT'S NOT QUITE SO EASY TO DO THINGS LIKE HAVE EACH FACE A
SEPARATE COLOR (BUT WHO WANTS WIMPY SEPARATE COLORS WHEN YOU CAN HAVE
EVOLVING TEXTURE PATTERNS, EH? :).
╘HE PROGRAM MAKES A FEW REFINEMENTS TO THIS TECHNIQUE. ╞OR INSTANCE, INSTEAD
OF COLORING THE ENTIRE BUFFER WHITE, IT CALCULATES AHEAD OF TIME THE MINIMUM
AND MAXIMUM VALUES FOR Y, AND ONLY COLORS THAT PART OF THE DRAWING AREA
WHITE.
╞OR THE SAKE OF COMPLETENESS, HERE IS ANOTHER METHOD OF FILLING:
EXCLUSIVE-OR. ┴ CLEVER WAY OF FILLING FACES IS TO USE SOME ┼╧╥ MAGIC. ╠ET'S
SAY WE WANT TO FILL EVERYTHING BETWEEN TWO POINTS ┴ AND ┬. ╫E WANT TO START
FILLING AT POINT ┴ AND STOP AT POINT ┬, AND SINCE ┼╧╥ IS A BIT FLIPPER THIS
GIVES US A MEANS OF FILLING. ├ONSIDER THE FOLLOWING SITUATION IN MEMORY:
00010000 <-- ╨OINT ┴
00000000
00000000
00010000 <-- ╨OINT ┬
╬OW CONSIDER THE FOLLOWING LITTLE PIECE OF CODE:
╠─┴ #00
┼╧╥ ┴
╙╘┴ ┴
┼╧╥ ┴+1
╙╘┴ ┴+1
┼╧╥ ┴+2
╙╘┴ ┴+2
┼╧╥ ┴+3 ;POINT ┬
╘HE RESULT IS:
00010000
00010000
00010000
00010000
╘HIS IS THE CONCEPTUAL IDEA BEHIND AN ┼╧╥-BUFFER. ╨RETTY NEAT, EH? ┬UT WE
CAN'T JUST IMPLEMENT THIS AS-IS. ╔N FACT WE HAVE A WHOLE SLEW OF THINGS TO
WORRY ABOUT NOW. ╘RY ┼╧╥ING A VERTICAL LINE. ╫HAT ABOUT WHEN TWO LINES
SHARE A SINGLE PIXEL AT THEIR INTERSECTION? ╫HAT HAPPENS IN COLOR?
┴H RECKON Y'ALL WILL JUST HAVE TO WAIT UNTIL NEXT TIME TUH SEE :).
─A ╨ROGRAM
----------
╠ET'S REVIEW THE CODE. ╫E CHECK TO SEE IF WE SHOULD INCREASE OR DECREASE THE
ROTATION RATE (OR QUIT), AND THEN UPDATE THE ANGLES. ╬EXT WE CALCULATE THE
ROTATION MATRIX USING A TABLE OF SINES AND COSINES. ╘HEN WE ROTATE AND
PROJECT THE POINTS BY USING A TABLE OF D/(Z/64-Z0) VALUES. ╙OMEWHERE IN THERE
WE CLEAR A WORKING BUFFER, DRAW ALL OF THE LINES, SWAP THE BUFFERS, PASS ╟O,
COLLECT $200 (ACTUALLY, CONSIDERING WHERE THE BUFFERS ARE LOCATED WE EITHER
COLLECT $300 OR $380 :), AND GO AROUND THE LOOP AGAIN.
╞IRST, SOME BUGS. ╘HERE WERE TWO PLACES IN THE LINE DRAWING ROUTINE WHERE AN
╙┬├ WAS PERFORMED WITH THE CARRY CLEAR WHEN IT SHOULD HAVE BEEN SET, SO WE
NEED TO ADD SOME ╙┼├S IN THERE. ╙OMEWHERE THERE IS A STRANGE BUG RELATED TO
Y-ROTATIONS, BUT ╔ DIDN'T TRACK IT DOWN.
┴LTHOUGH NOT A BUG, THERE IS SOMETHING TO THINK ABOUT. ╧N THE COMPUTER, X
INCREASES TO THE RIGHT, AND Y-INCREASES DOWNWARDS, WITH Z COMING OUT OF THE
SCREEN. ┬UT THIS IS A LEFT-HANDED COORDINATE SYSTEM, AND ALL OUR
CALCULATIONS WERE PERFORMED IN A RIGHT-HANDED COORDINATE SYSTEM. ╫HAT THIS
MEANS IS THAT ONE OF OUR COORDINATES IS ACTUALLY A MIRROR-IMAGE OF WHAT IT
SHOULD BE, WHILE THE OTHER COORDINATE IS WHERE IT IS SUPPOSED TO BE.
╥EMEMBER THAT A PROJECTION GENERATES A NEGATIVE MIRROR-IMAGE OF THE OBJECT --
THE COMPUTER COORDINATE SYSTEM MIRRORS A SINGLE AXIS OF THE IMAGE AGAIN!
┬ECAUSE OF THE SYMMETRY OF A CUBE, THIS MAKES NO DIFFERENCE. ┴ SMART WAY TO
FIX THIS IS TO TRANSLATE THE OBJECT IN _FRONT_ OF THE PROJECTION PLANE, I.E.
TO USE THE TRANSLATION Z=Z+C INSTEAD OF THE CURRENTLY USED Z=Z-C, BUT STILL
PROJECT THROUGH THE ORIGIN AND INTO THE PLANE Z=1. ╙INCE ╔ AM NOT
PARTICULARLY SMART THOUGH, NOT TO MENTION LAZY AND UNMOTIVATED, ╔ DIDN'T
BOTHER TO FIX THIS.
┬EFORE WE START ADDING THE NEW STUFF LIKE HIDDEN SURFACES INTO THE CODE, WHY
DON'T WE THINK ABOUT DOING SOME SIMPLE OPTIMIZATIONS TO THE OLD CODE? ╧NE
REALLY EASY THING TO FIX IS IN THE PROJECTION ROUTINE. ┘OU WILL RECALL THAT
THE EARLIER PROGRAM ROTATED Z AND THEN ADDED 128 TO IT TO USE AS AN INDEX.
╫HY BOTHER TO ADD 128 AT ALL? ╔ DUNNO -- SOMETIMES THINGS SEEM LIKE A GOOD
IDEA AT THE TIME. ╙O THAT'S SOMETHING TO FIX. ╔T'S NOT THAT IT'S A BIG WASTE
OF TIME, IT'S JUST ONE OF THOSE ANNOYING THINGS THAT THERE'S NO REASON FOR.
╚OW ABOUT THE VARIABLES? ╘HEY'RE ALL JUST SITTING AT THE END OF THE PROGRAM
-- WHY NOT MOVE THEM ALL INTO ZERO PAGE? ╙OUNDS GOOD TO ME! ╫E JUST NEED TO
MAKE SURE WE DON'T USE ANY SENSITIVE LOCATIONS IN ZERO PAGE THAT WILL HOSE
THE WHOLE COMPUTER. ╙O NOW THAT'S FIXED.
╧N THE ├64 AN INTERRUPT IS PERFORMED EVERY 60TH OF A SECOND WHICH SCANS THE
KEYBOARD AND THINGS LIKE THAT -- WHY IN THE WORLD DO WE WANT THAT RUNNING IN
THE MIDDLE OF ALL OUR CALCULATIONS? ╔ DUNNO -- LET'S TURN IT OFF (BUT TURN
IT BACK ON BEFORE CHECKING TO SEE IF ╞1 ETC. WAS PRESSED!).
┴ FOOTNOTE OBSERVATION: WHEN THE ROTATION MATRIX IS CALCULATED, TWO MACROS
ARE USED (═╒╠2 AND ─╔╓2) WHICH MULTIPLY AND DIVIDE A SIGNED NUMBER BY TWO.
╔T NEVER CEASES TO AMAZE ME WHAT HAPPENS WHEN YOU SIMPLY SIT DOWN AND THINK
ABOUT SOMETHING, AND IN THIS CASE THESE TWO MACROS CAN BE MADE MUCH SIMPLER:
═╒╠2 ┴╙╠ ;╘HAT'S ALL, FOLKS
─╔╓2 ├╠├
┬╨╠ :╨╧╙
╙┼├
:╨╧╙ ╥╧╥
╘HESE TWO ROUTINES WILL MULTIPLY/DIVIDE A SIGNED 2'S COMPLEMENT NUMBER
BY TWO (NOTE THAT THE SOURCE INCLUDED WITH THIS ARTICLE USES THE OLD METHOD).
╘HERE'S THE EASY STUFF TO FIX. ╫HAT ABOUT THE CALCULATIONS THEMSELVES? ╘HE
ROTATION IS PRETTY STRAIGHTFORWARD -- NAH, SKIP THAT. ╘HE LINE DRAWING
ROUTINE TAKES UP AN AWFUL LOT OF TIME -- MAYBE WE CAN SPEED THAT UP? ╘HAT'S
FOR A FUTURE ARTICLE :). ├LEARING THE BUFFER TAKES A LOT OF TIME, BUT NOW
THAT WE'RE GOING TO HAVE FILLED FACES THERE ISN'T TOO MUCH WE CAN DO ABOUT
THAT. ╔N FACT, SO MUCH MORE TIME IS SPENT IN THOSE TWO AREAS THAN IS SPENT
IN OTHER PARTS OF THE CODE THAT ANY OTHER OPTIMIZATIONS WE MAKE REALLY AREN'T
GOING TO MAKE A VERY BIG DIFFERENCE... ┬╒╘...
╚OW ABOUT MULTIPLICATIONS?
╞AST ╙IGNED ═ULTIPLY
--------------------
┴H, NOW HERE IS SOMETHING WE CAN FIX. ├ONSIDER THE FOLLOWING FUNCTION:
F(X) = X*X/4
╬OW NOTICE THAT
F(A+B) - F(A-B) = A*B
╫OWSERS! ┴LL WE NEED TO DO IS HAVE A TABLE OF SQUARES, AND WE CAN DO A
MULTIPLICATION IN NO TIME!
╫HOA THERE, WAIT A MINUTE, ALL OF OUR CALCULATIONS ARE USING SIGNED NUMBERS.
╫ON'T THAT MAKE A DIFFERENCE? ╫ELL, THE ABOVE CALCULATION IS COMPLETELY
GENERAL -- ╔ NEVER SAID WHAT THE SIGN OF A AND B ARE. ╘HE FACT THAT WE ARE
USING TWO'S COMPLEMENT NOTATION MAKES THIS EVEN SIMPLER!
╥ECALL THAT OUR MULTIPLICATION IS
X -> X * [D/(Z0-Z/64)]
WHERE X IS A SIGNED FLOATING POINT NUMBER MULTIPLIED BY 64 (THAT IS, INSTEAD
OF GOING FROM -1 TO 1 X WOULD GO FROM -64 TO 64). ╨REVIOUSLY WE MADE D
LARGE, SO THAT THE TABLE OF D/(Z-Z0) WOULD BE MORE ACCURATE. ╘HEN WE
MULTIPLIED THE NUMBERS TOGETHER AND DIVIDED BY 64, A PROCEDURE WHICH TOOK
BETWEEN 150 AND 180 CYCLES, LEAVING US WITH A SIGNED, 8-BIT RESULT.
╫ELL, THAT'S EASY TO DUPLICATE. ╞ROM OUR FIRST EQUATION ABOVE, WE SEE THAT
(A*B)/64 = [ F(A+B) - F(A-B) ]/64
= G(A+B) - G(A-B)
WHERE
G(X) = X*X/256.
╔N OTHER WORDS, IF WE MODIFY OUR TABLE SLIGHTLY, WE GET EXACTLY THE RESULT WE
WANT. ╙O HERE IS THE CODE TO MULTIPLY TWO NUMBERS TOGETHER:
* ┴*┘ -> ┴ ╙IGNED, 8-BIT RESULT
╙╘┴ ┌╨1 ;┌╨1 -- ZERO PAGE POINTER TO TABLE OF G(X)
┼╧╥ #$╞╞
├╠├
┴─├ #$01
╙╘┴ ┌╨2 ;┌╨2 ALSO POINTS TO G(X)
╠─┴ (┌╨1),┘ ;G(┘+┴)
╙┼├
╙┬├ (┌╨2),┘ ;G(┘-┴)
┴ND THAT'S IT -- WE'RE DONE. ╘HE ABOVE TAKES 24-26 CYCLES TO EXECUTE -- NOT
BAD AT ALL! ┘ES, WITH ANOTHER TABLE WE COULD MAKE IT EVEN FASTER, BUT THIS
IS GOOD ENOUGH FOR US.
┴T THE MOMENT WE DON'T DO VERY MANY MULTIPLICATIONS, BUT IN THE FUTURE, WHEN
WE WRITE A GENERALIZED ROUTINE TO ROTATE AND PROJECT AN ARBITRARY OBJECT,
THIS WILL GIVE US A HUMONGOUS TIME SAVINGS.
┴STUTE READERS MAY BE THINKING AHEAD HERE: IN THE PROGRAM, FOR EACH
PROJECTION WE HAVE TWO MULTIPLICATIONS, X=X*C AND Y=Y*C, WHERE C IS THE SAME
IN BOTH CASES. ╙O IF WE STORE C IN ┌╨1 AND ┌╨2, WE CAN MAKE THE
MULTIPLICATION EVEN MORE EFFICIENT, RIGHT? ╘HE ANSWER IS YES, BUT ONLY BY
BEING EXTREMELY CAREFUL, FOR REASONS THAT WILL BE DETAILED IN EXACTLY TWO
PARAGRAPHS.
┬╒╘ ╫┴╔╘! ╫E HAVE TO THINK ABOUT A FEW THINGS HERE. ╫HAT HAPPENS WHEN WE
MULTIPLY, SAY, -1 * -1. ╔N TWO'S COMPLEMENT NOTATION -1 IS EQUAL TO 255. ╙O
OUR ABOVE ALGORITHM ADDS 255 TO 255 TO GET AN INDEX INTO THE TABLE AND
GETS... OOPS! ╧UR TABLE NEEDS TO BE LARGER THAN 256 BYTES! ╔N FACT THIS IS
VERY EASY TO FIX, BECAUSE OF THE WAY TWO'S COMPLEMENT WORKS. ┴LL WE NEED TO
DO IS PUT AN EXACT COPY OF THE 256 BYTE TABLE ON TOP OF ITSELF, AND THE TABLE
WILL WORK FINE. (╔F YOU LOOK AT THE INITIALIZATION PROGRAM YOU WILL NOTICE
THAT THE STATEMENT IS: Q%=S*S:POKE BM+J,Q%:POKE BM+J+256,Q%).
┬╒╘ ╫┴╔╘!!! ╫HAT KINDS OF NUMBERS ARE WE MULTIPLYING TOGETHER HERE? ╧UR
VERTICES START OUT AT THE POINTS (+/-1,+/-1,+/-1). ╧UR ROTATIONS CORRESPOND
TO MOVING THESE POINTS AROUND ON A SPHERE, SO IT IS EASY TO SEE THAT THE
LARGEST ROTATED VALUE WE CAN HAVE IS SQR(3), THE RADIUS OF THIS SPHERE.
╙INCE WE ARE MULTIPLYING THESE NUMBERS BY 64, THE LARGEST VALUE WE CAN HAVE
FOR THESE NUMBERS IS 64*SQR(3) = 111. ╧KAY, NO BIG WHOOP, WHAT ARE THE
VALUES FOR D/(Z0-Z/64) ANYWAYS? ╫ELL, FOR Z0=5 AND D=150 SAY WE GET VALUES
LIKE 28...
┴├╦! ╫HEN WE GO TO MULTIPLY WE ARE GOING TO ADD 111 TO 28 AND GET 137, BUT
IN TWO'S COMPLEMENT NOTATION THIS IS EQUAL TO -119.
┼XAMPLE:
A=28
B=111
F(B+A) = F(137) = F(-119) IN TWO'S-COMPLEMENT NOTATION
F(B-A) = F(83)
╔N OUR TABLE LOOKUP WE REALLY WANT 137*137 BUT WE ARE GOING TO GET -119*-119!
╧NE OPTION IS TO NEVER CHOOSE D VERY LARGE SO THAT WE DON'T HAVE THIS
PROBLEM, BUT THE SOLUTION TURNS OUT TO BE MUCH SIMPLER, AGAIN DUE TO THE WAY
TWO'S COMPLEMENTING WORKS.
╫E CAN SEE THAT WE CAN GET NUMBERS LARGER THAN 127 WHEN WE ADD THE TWO
MULTIPLICANDS TOGETHER. ╫HAT IS THE _SMALLEST_ NUMBER WE WILL COME UP WITH?
├ERTAINLY THE SMALLEST X IS GOING TO GET IS -111. ┴HHH... D/(Z0-Z/64) IS
ALWAYS POSITIVE, SO WHEN WE ADD THEM TOGETHER WE WILL GET SOMETHING LARGER
THAN -111, WHICH IN TWO'S COMPLEMENT NOTATION IS 145. ╘HIS MEANS THAT WE CAN
TREAT THE TABLE ENTRIES BETWEEN 127 AND AT LEAST 145 AS POSITIVE NUMBERS
INSTEAD OF TWO'S COMPLEMENT NEGATIVE NUMBERS, AND EVERYTHING WILL WORK OUT
GREAT.
╔NCIDENTALLY, FUDGING THIS TABLE PROVIDES AN EASY WAY TO ADD PRETTY COOL
SPECIAL EFFECTS. ╘HE INITIALIZATION PROGRAM SETS UP THE MATH TABLE USING THE
FOLLOWING LINE:
[FOR J=0 TO 255]
290 ╙=╩:╔╞ ╙>150 ╘╚┼╬ ╙=256-╙
[POKE BM+J,╙*╙]
╘RY CHANGING THE INEQUALITY FROM ╙>150 TO ╙>120 (OR ╙>127, WHERE IT WOULD BE
FOR A TWO'S COMPLEMENT TABLE), AND SEE WHAT HAPPENS!
┴ND THIS IS WHY WE CAN'T STORE D/(Z0-Z) IN THE POINTERS ┌╨1 AND ┌╨2 -- IF WE
DID, THEN FOR A GIVEN MULTIPLICATION WE COULD GET NUMBERS LARGER THAN 127 AND
SMALLER THAN -128, AND OUR CLEVER TABLE WOULD NO LONGER WORK RIGHT. ╫E CAN
STILL GET AROUND THIS -- ALL WE NEED IS TWO CLEVER TABLES, ONE FOR THE
POSITIVE D/(Z0-Z) AND ONE FOR NEGATIVE D/(Z0-Z). ╞OR THE FIRST TABLE, WE
HAVE THE SITUATION OUTLINED ABOVE: NO NUMBERS SMALLER THAN -90 OR SO, AND
NUMBERS POSSIBLE LARGER THAN 127. ╞OR THE SECOND TABLE WE HAVE THE REVERSE
SITUATION: NO NUMBERS LARGER THAN 90 OR SO, BUT POSSIBLE NUMBERS LESS THAN
-128. ╙INCE WE ARE USING TWO POINTERS ANYWAYS (┌╨1 AND ┌╨2), THIS IS NOT
DIFFICULT TO IMPLEMENT.
╘HE END RESULT IS THAT YOU CAN DO THE ENTIRE PROJECTION IN AROUND 36 CYCLES
IF YOU SO DESIRE. 36 CYCLES? ╬OTE THAT FOR THE SECOND TABLE THE CODE DOES
SOMETHING LIKE ┼╧╥ #$╞╞; ├╠├; ┴─├ #$01. ╫ELL, IF WE SET UP THE SECOND TABLE
AS F(X)=(X+1)^2/4 THEN WE HAVE INCLUDED THE ├╠├ AND ┴─├ #$01 INTO THE TABLE,
SO THE INSTRUCTIONS CAN BE REMOVED. ╘HE ENTIRE PROJECTION ROUTINE IS THEN:
... (ROTATE Z)
╙╘┴ ┌╨1
┼╧╥ #$╞╞
╙╘┴ ┌╨2
... (ROTATE X)
╘┴┘
╠─┴ (┌╨1),┘
╙┼├
╙┬├ (┌╨2),┘ ;╬OW ┴ CONTAINS PROJECTED ╪
... (ROTATE Y)
╘┴┘
╠─┴ (┌╨1),┘
╙┼├
╙┬├ (┌╨2),┘
╠OOKS LIKE 36-40 CYCLES TO ME! ╘HE PROGRAM DOESN'T IMPLEMENT THIS -- IT ONLY
USES A SINGLE TABLE, AND REPEATS THE ╙╘┴ ┌╨1 STUFF AT EACH STEP. ┴ FEW
CYCLES WASTED WON'T KILL US (THERE ARE PLENTY OF CYCLES WASTED IN THE CODE),
AND IT IS PROBABLY TRICKY ENOUGH TO FOLLOW AS IT IS.
┘OU MIGHT BE ASKING, WHAT IS THE TRUE MINIMUM VALUE FOR A GIVEN Z0 AND D?
╫ELL, ╔ TRIED WRITING DOWN A SET OF EQUATIONS AND MINIMIZING ACCORDING TO
SOME CONSTRAINTS, AND ╔ ENDED UP WITH A SIXTH-ORDER POLYNOMIAL WHICH ╔ HAD TO
WRITE LITTLE NEWTON-ITERATION SOLVER FOR. ╔N OTHER WORDS, ╔ DON'T THINK YOU
CAN WRITE DOWN A SIMPLE FUNCTION OF D AND Z0 TO GIVE THE TABLE BOUNDARIES. ╔
FOUND 150 TO BE A PERFECTLY REASONABLE NUMBER TO USE.
╔NCIDENTALLY, THIS IS WHY THE PROJECTION WAS NOT CHANGED TO Z=Z+C -- ╔ DIDN'T
WANT TO GO FIDDLING AROUND WITH IT AGAIN. ═AYBE NEXT TIME :).
╧╬┼ ═╧╥┼ ╘╚╔╬╟!!! ╘HIS IS VERY IMPORTANT. ╘HE MATH TABLE ═╒╙╘ BE ON AN EVEN
BOUNDARY FOR THE ABOVE ALGORITHM TO WORK CORRECTLY. ╘HIS ONE IS EASY TO GET
BIT BY.
╠OGARITHMIC ═ULTIPLICATION
--------------------------
┴S LONG AS WE'RE TALKING ABOUT FAST MULTIPLICATION HERE, IT IS WORTHWHILE TO
MENTION ANOTHER METHOD FOR MULTIPLYING TWO NUMBERS TOGETHER. ╘O UNDERSTAND
IT YOU NEED TO UNDERSTAND TWO IMPORTANT PROPERTIES OF LOGARITHMS:
LOG(X*Y) = LOG(X) + LOG(Y)
LOG_B(X) = Y <=> B^Y = X
╘HESE ARE A REFLECTION OF THE FACT THAT LOGARITHMS ARE INVERSES OF
EXPONENTIATION. ╙O YOU CAN SEE THAT ANOTHER WAY TO MULTIPLY TWO NUMBERS
TOGETHER IS TO TAKE THEIR LOGS, ADD, AND THEN EXPONENTIATE THE RESULT. ╙O
YOU COULD HAVE A TABLE OF LOG_2 (BASE 2 LOGARITHMS) AND ANOTHER TABLE OF 2^X,
AND DO A MULTIPLICATION VERY QUICKLY. (┴CTUALLY, YOU'D WANT A TABLE OF
32*LOG_2(X), SINCE LOG_2(256)=8). ╫HY WASN'T THIS METHOD USED?
╞IRST, DEALING WITH SIGNED NUMBERS IS MUCH TRICKIER -- THE LOGARITHM OF A
NEGATIVE NUMBER IS A COMPLEX (I.E. REAL+IMAGINARY) NUMBER, COMPLETE WITH
BRANCH CUTS. ┘OU CAN GET AROUND THIS BY SETTING UP THE TABLES IN A SPECIAL
WAY (FOR INSTANCE BY LETTING LOG(-X)=-LOG(X)) AND PUTTING IN SOME SPECIAL
HANDLING, BUT IT ISN'T AS EFFICIENT AS THE ALGORITHM USED IN THE PROGRAM.
╙ECOND, ACCURACY DECREASES SIGNIFICANTLY AS X AND Y GET LARGE, SO THAT FOR AN
EIGHT-BIT TABLE OF LOGARITHMS YOU WILL OFTEN GET AN ANSWER THAT IS OFF BY ONE
OR MORE. ┘OU CAN IN FACT GET AROUND THIS PROBLEM BY USING SOME SNEAKY
MANIPULATION -- IF YOU ARE INTERESTED IN SEEING THIS, CONTACT US!
┬UT IT IS WORTHWHILE TO KEEP THIS METHOD IN MIND IF YOU NEED A REALLY FAST
MULTIPLICATION AND YOU AREN'T TOO WORRIED ABOUT ACCURACY.
├HRISTOPHER ╩AM (PHILLIPS@EE.UWA.EDU.AU) HAS COME UP WITH AN INTERESTING
VARIATION ON THIS METHOD. ╔T CALCULATES 64+64*X/Z AND USES A SLIGHTLY
DIFFERENT STRUCTURE FOR THE SIGNED NUMBERS, AND RUNS ALMOST AS FAST AS THE
METHOD USED BY THE PROGRAM -- CONTACT HIM FOR MORE INFORMATION IF YOU'RE
INTERESTED.
╚IDDEN ╙URFACES
---------------
╘HE REMAINDER OF THIS FOLLOWS RIGHT FROM THE DISCUSSION SECTION. ╔N THE
PROGRAM THE CUBE VERTICES ARE LABELED AS
╨1 = 1,1,1
╨2 = 1,-1,1
╨3 = -1,-1,1
╨4 = -1,1,1
╨5 = 1,1,-1
╨6 = 1,-1,-1
╨7 = -1,-1,-1
╨8 = -1,1,-1
AND THE FACES ARE CHOSEN TO BE
╞ACE 1: ╨1 ╨2 ╨3 ╨4
6: ╨5 ╨6 ╨7 ╨8
╞ACE 2: ╨1 ╨2 ╨5 ╨6
5: ╨3 ╨4 ╨7 ╨8
╞ACE 3: ╨1 ╨4 ╨8 ╨5
4: ╨2 ╨3 ╨6 ╨7
(THINK OF IT AS A SIX-SIDED DICE, WITH SIX OPPOSITE OF ONE, ETC.). ╘HE NORMAL
VECTORS ARE THEN
╞ACE 1: ╨1-╨5
╞ACE 2: ╨1-╨4
╞ACE 3: ╨1-╨2
╘HIS MEANS THAT WE NEED TO STORE THE Z-COORDINATES FOR POINTS 1,2,4, AND 5.
╬OTE THAT THE OPPOSITE FACES HAVE EXACTLY OPPOSITE NORMAL VECTORS, SO THAT
FOR INSTANCE THE NORMAL VECTOR FOR FACE 6 IS ╨5-╨1, THE NEGATIVE OF FACE 1.
╚ERE IS SOMETHING TO CONSIDER: WHEN ONE FACE IS VISIBLE, THE OPPOSITE FACE
CANNOT BE VISIBLE! ┬ECAUSE OF THE WAY PROJECTIONS WORK, THOUGH, THE CONVERSE
IS NOT TRUE; IT IS ENTIRELY POSSIBLE TO HAVE TWO OPPOSITE FACES INVISIBLE.
╘O PROVE THIS TO YOURSELF JUST LOOK AT YOUR FAVORITE BOX, LIKE YOUR MONITOR,
STRAIGHT-ON, AND NOTICE THAT YOU CAN'T SEE THE SIDES!
┴LL THAT THE PROGRAM DOES IS SUBTRACT Z-COORDINATES AND ADD THEM TO THE
CONSTANT ╦, AND CHECK THE SIGN. ╒NFORTUNATELY WE CAN HAVE A POSITIVE
OVERFLOW WHILE ADDING STUFF TOGETHER (SINCE THESE ARE SIGNED NUMBERS), AND IF
WE DON'T CATCH THE POSITIVE OVERFLOW WE WILL CALCULATE A NEGATIVE RESULT WHEN
THE RESULT IS ACTUALLY POSITIVE! ╘HIS WILL OF COURSE WRECK THE HIDDEN
SURFACE REMOVAL.
╞ILLED ╞ACES
------------
╘HE PROGRAM CURRENTLY USES THE FIRST ALGORITHM TO FILL FACES, I.E. THE
COOKIE-CUTTER ELEPHANT-CARVING METHOD. ─URING THE PROJECTIONS THE PROGRAM
CHECKS EACH VALUE OF Y TO FIND THE MINIMUM AND MAXIMUM VALUES FOR THIS PLOT,
YMIN AND YMAX. ╘HE PROGRAM THEN CLEARS THE BUFFER UP TO AND INCLUDING YMIN,
FILLS THE BUFFER FROM YMIN+1 TO YMAX-1, AND THEN CLEARS THE REST OF THE
BUFFER. ╫HY DOES IT CLEAR YMIN AND YMAX? ┬ECAUSE THE ONLY THING THAT CAN
HAPPEN ON THOSE LINES IS AN EDGE -- THERE IS NO POINT IN FILLING THESE LINES
AND THEN CLEARING THEM, SINCE THEY WILL ALWAYS BE CLEAR. ┬Y ONLY FILLING THE
BUFFER BETWEEN YMIN AND YMAX, WE SAVE SOME TIME IN REMOVING THE JUNK FROM THE
EDGES OF THE CUBE.
╬EXT, THE CUBE IS DRAWN. ╘HE BACKGROUND IS BLACK AND THE FACES ARE WHITE,
I.E. OUR FILL COLOR IS WHITE. ├LEARLY THEN WE WANT TO DRAW OUR LINES IN
BLACK. ╔ COULD HAVE REVERSED BACKGROUND AND FOREGROUND COLORS AND LEFT THE
LINE ROUTINE AS-IS, BUT OF COURSE BEING THE LAZY PROGRAMMER ╔ AM ╔ DECIDED
INSTEAD TO CHANGE THE TABLE ┬╔╘╨. ┘OU MAY RECALL THAT THE EARLIER TABLE HAD
ENTRIES LIKE %10000000 %01000000 ETC. ╬OW IT HAS ENTRIES LIKE %01111111
%10111111 ETC., AND INSTEAD OF ╧╥┴ING THE VALUES INTO THE BUFFER, THEY ARE
┴╬─ED INTO THE BUFFER. ╘HIS THEN DRAWS LINES OF ZEROES INTO OUR BUFFER WHICH
IS SOLID ONES.
╞INALLY, TO UN-FILL THE OUTSIDE OF THE CUBE THE PROGRAM SIMPLY GOES THROUGH
THE BUFFER FROM YMIN TO YMAX, COLORING EVERYTHING BLACK UNTIL IT HITS A ZERO,
I.E. AN EDGE. ┴T THIS POINT IT CALCULATES THE APPROPRIATE PATTERN TO CLEAR
UP TO THE EDGE, AND THEN DOES THE SAME THING STARTING FROM THE RIGHT HAND
SIDE OF THE BUFFER. ╔N OTHER WORDS IT RUNS ALONG A SPECIFIC Y-VALUE COLORING
EVERYTHING BLACK UNTIL IT HITS THE EDGE OF THE CUBE, AND DOES THIS FOR ALL
THE RELEVANT Y-VALUES.
╘EXTURE ═APPING
---------------
═ORE OF A FILL-PATTERN REALLY. ╘HE PROGRAM CUBE3D2.1.O DOES ALL OF THE ABOVE
BUT IN MULTICOLOR MODE. ╬OW INSTEAD OF USING A SOLID COLOR TO FILL THE
BUFFER THE PROGRAM USES A SERIES OF COLORED LINES -- REALLY A VERY SIMPLE
PATTERN. ┴ MUCH NEATER THING WOULD BE TO HAVE A PATTERN DRAWN OUT IN A
PATTERN BUFFER, AND TO COPY THAT INTO THE DRAWING BUFFER. ╧THER THINGS TO
TRY ARE COLORED SQUARES WHICH SHIFT AROUND. CUBE3D2.1.O IS JUST A REALLY
QUICK HACK, BUT AT LEAST IT DEMONSTRATES THE CONCEPT.
═┴╦┼ ╙╒╥┼ THAT YOU CHANGE THE VALUE OF ─ FROM 170 TO 85 IF YOU TRY THIS
PROGRAM! ╨IXELS ARE DOUBLED NOW, SO THAT RESOLUTION IS CUT IN HALF. ╘HIS IS
LOCATED AT LINE 240 IN ╔╬╔╘3─2.0
═EMORY ═AP
----------
╘HE MAIN PROGRAM IS LOCATED AT $8000=32768 AND IS 3200 BYTES LONG.
$8000-$8├00 - ╨ROGRAM
$8├00-$8├80 - ┬IT POSITION TABLE
$8├80-$8─00 - ╘ABLE OF SINES
$8─00-$8─80 - ╘ABLE OF COSINES.
$8─80-$8┼80 - ╘ABLE OF D/(Z0-Z/64)
$8╞00-$9100 - ╘WO 256-BYTE TABLES OF G(X)=X*X/256
$3000 - ╞IRST DRAWING BUFFER
$3800 - ╙ECOND DRAWING BUFFER
╔╬╔╘3─ IS A SIMPLE BASIC PROGRAM TO SET UP THE TABLES. ╞OR ╔╬╔╘3─2.X THE
IMPORTANT SETUP ROUTINES ARE:
LINES 100-150 - ╙ET UP THE TRIGONOMETRIC TABLES
LINES 233-310 - ╙ET UP THE PROJECTION AND MULT TABLES
240 - ╠OCATION OF CONSTANTS ─ AND ┌0
290 - ╙ET TABLE BOUNDARY FOR MULTIPLICATION
╘HAT'S ALL -- UNTIL NEXT TIME...
╙TEVE ╩UDD ╟EORGE ╘AYLOR 12/2/95
╘HIS DOCUMENT IS ├OPYRIGHT 1995 BY ╙TEPHEN ╩UDD AND ╟EORGE ╘AYLOR. ═UCH LIKE
THE PREVIOUS ONE. ╔T IS ALSO FREELY DISTRIBUTABLE.
┴ND HERE IS THE SOURCE CODE:
********************************
* *
* ╙TEPHEN ╩UDD *
* ╟EORGE ╘AYLOR *
* ╙TARTED: 7/11/94 *
* ╞INISHED: 7/19/94 *
* V2.0 ├OMPLETED: 12/17/94 *
* *
* ╫ELL, IF ALL GOES WELL THIS *
* PROGRAM WILL ROTATE A CUBE. *
* *
* V2.0 + ╬EW AND ╔MPROVED! *
* ╬OW WITH FASTER ROUTINES, *
* HIDDEN SURFACES, FILLED *
* FACES, AND EXTRA TOP SECRET *
* TEXT MESSAGES! *
* *
* ╘HIS PROGRAM IS INTENDED TO *
* ACCOMPANY THE ARTICLE IN *
* ├=╚ACKING, ╩AN. 95 ISSUE. *
* ╞OR DETAILS ON THIS PROGRAM, *
* READ THE ARTICLE! *
* *
* ╫RITE TO US! *
* *
* ═YSELF WHEN YOUNG DID *
* EAGERLY FREQUENT *
* ─OCTOR AND ╙AINT, AND HEARD *
* GREAT ┴RGUMENT *
* ┴BOUT IT AND ABOUT: BUT *
* EVERMORE *
* ├AME OUT BY THE SAME ─OOR *
* AS IN ╔ WENT. *
* - ╥UBAIYAT *
* *
* ╘HOUGH ╔ SPEAK WITH THE *
* TONGUES OF MEN AND OF ANGLES *
* AND HAVE NOT LOVE, ╔ AM *
* BECOME AS SOUNDING BRASS, OR *
* A TINKLING CYMBAL. *
* - 1 ├ORINTHIANS 13 *
* *
* ╨.╙. ╘HIS WAS WRITTEN USING *
* ═ERLIN 128. *
********************************
╧╥╟ $8000
* ├ONSTANTS
┬╒╞╞1 ┼╤╒ $3000 ;╞IRST CHARACTER SET
┬╒╞╞2 ┼╤╒ $3800 ;╙ECOND CHARACTER SET
┬╒╞╞┼╥ ┼╤╒ $┴3 ;╨RESUMABLY THE TAPE WON'T BE RUNNING
╪1 ┼╤╒ $╞┬ ;╨OINTS FOR DRAWING A LINE
┘1 ┼╤╒ $╞├ ;╘HESE ZERO PAGE ADDRESSES
╪2 ┼╤╒ $╞─ ;DON'T CONFLICT WITH ┬┴╙╔├
┘2 ┼╤╒ $╞┼
─╪ ┼╤╒ $╞9
─┘ ┼╤╒ $╞┴
╘┼═╨1 ┼╤╒ $╞┬ ;╧F COURSE, COULD CONFLICT WITH X1
╘┼═╨2 ┼╤╒ $╞├ ;╘EMPORARY VARIABLES
┌╘┼═╨ ┼╤╒ $02 ;╒SED FOR BUFFER SWAP. ─ON'T TOUCH.
┌1 ┼╤╒ $22 ;╒SED BY MATH ROUTINE
┌2 ┼╤╒ $24 ;─ON'T TOUCH THESE EITHER!
╦ ┼╤╒ $┬6 ;├ONSTANT USED FOR HIDDEN
;SURFACE DETECTION - DON'T TOUCH
╞┴├┼╙ ┼╤╒ $┬5 ;╒SED IN HIDDEN SURFACES.
┘═╔╬ ┼╤╒ $╞7 ;╒SED IN FILLED FACES -- AS
┘═┴╪ ┼╤╒ $╞8 ;USUAL, DON'T TOUCH
┴╬╟═┴╪ ┼╤╒ 120 ;╘HERE ARE 2*PI/ANGMAX ANGLES
* ╓╔├
╓═├╙┬ ┼╤╒ $─018
┬╦╟╬─ ┼╤╒ $─020
┬╧╥─┼╥ ┼╤╒ $─021
╙╙╘┴╥╘ ┼╤╒ 1344 ;ROW 9 IN SCREEN MEMORY AT 1024
* ╦ERNAL
├╚╥╧╒╘ ┼╤╒ $╞╞─2
╟┼╘╔╬ ┼╤╒ $╞╞┼4
* ╙OME VARIABLES
╘╪1 = $3╞
╘┘1 = $40
╘╪2 = $41
╘┘2 = $42
╨1╪ = $92 ;╘HESE ARE TEMPORARY STORAGE
╨1┘ = $93 ;╒SED IN PLOTTING THE PROJECTION
╨2╪ = $94
╨2┘ = $95 ;╘HEY ARE HERE SO THAT WE
╨3╪ = $96 ;DON'T HAVE TO RECALCULATE THEM.
╨3┘ = $┴┼
╨4╪ = $┴╞ ;╘HEY MAKE LIFE EASY.
╨4┘ = $┬0
╨5╪ = $┬1 ;╫HY ARE YOU LOOKING AT ME LIKE THAT?
╨5┘ = $┬2 ;─ON'T YOU TRUST ME?
╨6╪ = $┬3
╨6┘ = $┬4 ;╚AVING ANOTHER CHILD WASN'T MY IDEA.
╨7╪ = $71
╨7┘ = $50
╨8╪ = $51
╨8┘ = $52
╨1┌ = $57 ;╘HESE ARE Z-COORDINATES
╨2┌ = $58 ;╫E ONLY NEED THESE FOUR TO CHECK
╨4┌ = $59 ;FOR HIDDEN FACES
╨5┌ = $60
─╙╪ = $61 ;─╙╪ IS THE INCREMENT FOR
;ROTATING AROUND X
─╙┘ = $62 ;╙IMILAR FOR ─╙┘, ─╙┌
─╙┌ = $63
╙╪ = $64 ;╘HESE ARE THE ACTUAL ANGLES IN X Y AND Z
╙┘ = $65
╙┌ = $66
╘1 = $67 ;╘HESE ARE USED IN THE ROTATION
╘2 = $68
╘3 = $69 ;╙EE THE ARTICLE FOR MORE DETAILS
╘4 = $6┴
╘5 = $6┬
╘6 = $6├
╘7 = $6─
╘8 = $6┼
╘9 = $6╞
╘10 = $70
┴11 = $┴5 ;╘HESE ARE THE ELEMENTS OF THE ROTATION MATRIX
┬12 = $┴6 ;╪┘┌
├13 = $┴7
─21 = $┴8 ;╘HE NUMBER DENOTES (ROW,COLUMN)
┼22 = $┴9
╞23 = $┴┴
╟31 = $┴┬
╚32 = $┴├
╔33 = $┴─
*** ═ACROS
═╧╓┼ ═┴├
╠─┴ ]1
╙╘┴ ]2
<<<
╟┼╘╦┼┘ ═┴├ ;╫AIT FOR A KEYPRESS
╫┴╔╘ ╩╙╥ ╟┼╘╔╬
├═╨ #00
┬┼╤ ╫┴╔╘
<<<
*-------------------------------
╠─┴ #$00
╙╘┴ ┬╦╟╬─
╙╘┴ ┬╧╥─┼╥
╠─┴ ╓═├╙┬
┴╬─ #%00001111 ;╙CREEN MEMORY TO 1024
╧╥┴ #%00010000
╙╘┴ ╓═├╙┬
╠─┘ #00
╠─┴ #<╘╘┼╪╘
╙╘┴ ╘┼═╨1
╠─┴ #>╘╘┼╪╘
╙╘┴ ╘┼═╨2
╩═╨ ╘╔╘╠┼
╘╘┼╪╘ ╚┼╪ 9305111111 ;CLEAR SCREEN, WHITE, CRSR DN
╘╪╘ ' CUBE3D V2.0',0D,0D
╘╪╘ ' BY',0D
╚┼╪ 9╞ ;CYAN
╘╪╘ ' STEPHEN JUDD'
╚┼╪ 99
╘╪╘ ' GEORGE TAYLOR',0D,0D
╚┼╪ 9┬
╘╪╘ ' CHECK OUT THE JAN. 95 ISSUE OF',0D
╚┼╪ 96
╘╪╘ ' C=HACKING'
╚┼╪ 9┬
╘╪╘ ' FOR MORE DETAILS!',0D
╚┼╪ 0─1─1─9┼12
╘╪╘ 'F1/F2',92
╘╪╘ ' - INC/DEC X-ROTATION',0D
╚┼╪ 1─1─12
╘╪╘ 'F3/F4',92
╘╪╘ ' - INC/DEC Y-ROTATION',0D
╚┼╪ 1─1─12
╘╪╘ 'F5/F6',92
╘╪╘ ' - INC/DEC Z-ROTATION',0D
╚┼╪ 1─1─12
╘╪╘ 'F7',92
╘╪╘ ' RESETS',0D
╘╪╘ ' PRESS Q TO QUIT',0D
╚┼╪ 0─05
╘╪╘ ' PRESS ANY KEY TO BEGIN',0D
╚┼╪ 00
╘╔╘╠┼ ╠─┴ (╘┼═╨1),┘
┬┼╤ :├╧╬╘
╩╙╥ ├╚╥╧╒╘
╔╬┘
┬╬┼ ╘╔╘╠┼
╔╬├ ╘┼═╨2
╩═╨ ╘╔╘╠┼
╘╪╘ '╘HIS IS A SECRET TEXT MESSAGE!'
:├╧╬╘ >>> ╟┼╘╦┼┘
**** ╙ET UP TABLES(?)
* ╘ABLES ARE CURRENTLY SET UP IN ┬┴╙╔├
* AND BY THE ASSEMBLER.
╘┴┬╠┼╙ ╠─┴ #>╘═┴╘╚
╙╘┴ ┌1+1
╙╘┴ ┌2+1
**** ├LEAR SCREEN AND SET UP "BITMAP"
╙┼╘╒╨ ╠─┴ #$01 ;╫HITE
╙╘┴ $─021 ;╘HIS IS DONE SO THAT OLDER
╠─┴ #147 ;MACHINES WILL SET UP
╩╙╥ ├╚╥╧╒╘
╠─┴ #$00 ;CORRECTLY
╙╘┴ $─021
╠─┴ #<╙╙╘┴╥╘
┴─├ #12 ;╘HE GOAL IS TO CENTER THE GRAPHICS
╙╘┴ ╘┼═╨1 ;├OLUMN 12
╠─┴ #>╙╙╘┴╥╘ ;╥OW 9
╙╘┴ ╘┼═╨1+1 ;╙╙╘┴╥╘ POINTS TO ROW 9
╠─┴ #00
╠─┘ #00
╠─╪ #00 ;X WILL COUNT 16 ROWS FOR US
├╠├
:╠╧╧╨ ╙╘┴ (╘┼═╨1),┘
╔╬┘
┴─├ #16
┬├├ :╠╧╧╨
├╠├
╠─┴ ╘┼═╨1
┴─├ #40 ;╬EED TO ADD 40 TO THE BASE POINTER
╙╘┴ ╘┼═╨1 ;╘O JUMP TO THE NEXT ROW
╠─┴ ╘┼═╨1+1
┴─├ #00 ;╘AKE CARE OF CARRIES
╙╘┴ ╘┼═╨1+1
╠─┘ #00
╔╬╪
╘╪┴ ;╪ IS ALSO AN INDEX INTO THE CHARACTER NUMBER
├╨╪ #16
┬╬┼ :╠╧╧╨ ;╬EED TO DO IT 16 TIMES
**** ╙ET UP BUFFERS
╠─┴ #<┬╒╞╞1
╙╘┴ ┬╒╞╞┼╥
╠─┴ #>┬╒╞╞1
╙╘┴ ┬╒╞╞┼╥+1
╙╘┴ ┌╘┼═╨ ;ZTEMP WILL MAKE LIFE SIMPLE FOR US
╠─┴ ╓═├╙┬
┴╬─ #%11110001 ;╙TART HERE SO THAT SWAP BUFFERS WILL WORK RIGHT
╧╥┴ #%00001110
╙╘┴ ╓═├╙┬
**** ╙ET UP INITIAL VALUES
╔╬╔╘ ╠─┴ #00
╙╘┴ ─╙╪
╙╘┴ ─╙┘
╙╘┴ ─╙┌
╙╘┴ ╙╪
╙╘┴ ╙┘
╙╘┴ ╙┌
*-------------------------------
* ═AIN LOOP
**** ╟ET KEYPRESS
═┴╔╬
├╠╔
╦╨╥┼╙╙ ╩╙╥ ╟┼╘╔╬
├═╨ #133 ;╞1?
┬╬┼ :╞2
╠─┴ ─╙╪
├═╨ #┴╬╟═┴╪/2 ;╬O MORE THAN PI
┬┼╤ :├╧╬╘
╔╬├ ─╙╪ ;OTHERWISE INCREASE X-ROTATION
╩═╨ :├╧╬╘
:╞2 ├═╨ #137 ;╞2?
┬╬┼ :╞3
╠─┴ ─╙╪
┬┼╤ :├╧╬╘
─┼├ ─╙╪
╩═╨ :├╧╬╘
:╞3 ├═╨ #134
┬╬┼ :╞4
╠─┴ ─╙┘
├═╨ #┴╬╟═┴╪/2
┬┼╤ :├╧╬╘
╔╬├ ─╙┘ ;╔NCREASE Y-ROTATION
╩═╨ :├╧╬╘
:╞4 ├═╨ #138
┬╬┼ :╞5
╠─┴ ─╙┘
┬┼╤ :├╧╬╘
─┼├ ─╙┘
╩═╨ :├╧╬╘
:╞5 ├═╨ #135
┬╬┼ :╞6
╠─┴ ─╙┌
├═╨ #┴╬╟═┴╪/2
┬┼╤ :├╧╬╘
╔╬├ ─╙┌ ;Z-ROTATION
╩═╨ :├╧╬╘
:╞6 ├═╨ #139
┬╬┼ :╞7
╠─┴ ─╙┌
┬┼╤ :├╧╬╘
─┼├ ─╙┌
╩═╨ :├╧╬╘
:╞7 ├═╨ #136
┬╬┼ :╤
╩═╨ ╔╬╔╘
:╤ ├═╨ #'Q' ;Q QUITS
┬╬┼ :├╧╬╘
╩═╨ ├╠┼┴╬╒╨
:├╧╬╘ ╙┼╔ ;╙PEED THINGS UP A BIT
**** ╒PDATE ANGLES
╒╨─┴╘┼ ├╠├
╠─┴ ╙╪
┴─├ ─╙╪
├═╨ #┴╬╟═┴╪ ;┴RE WE >= MAXIMUM ANGLE?
┬├├ :├╧╬╘1
╙┬├ #┴╬╟═┴╪ :╔F SO, RESET
:├╧╬╘1 ╙╘┴ ╙╪
├╠├
╠─┴ ╙┘
┴─├ ─╙┘
├═╨ #┴╬╟═┴╪
┬├├ :├╧╬╘2
╙┬├ #┴╬╟═┴╪ ;╙AME DEAL
:├╧╬╘2 ╙╘┴ ╙┘
├╠├
╠─┴ ╙┌
┴─├ ─╙┌
├═╨ #┴╬╟═┴╪
┬├├ :├╧╬╘3
╙┬├ #┴╬╟═┴╪
:├╧╬╘3 ╙╘┴ ╙┌
**** ╥OTATE COORDINATES
╥╧╘┴╘┼
*** ╞IRST, CALCULATE T1,T2,...,T10
** ╘WO MACROS TO SIMPLIFY OUR LIFE
┴──┴ ═┴├ ;┴DD TWO ANGLES TOGETHER
├╠├
╠─┴ ]1
┴─├ ]2
* ╒SE TWO TRIG TABLES TO REMOVE THE BELOW ├═╨ ETC. CODE
├═╨ #┴╬╟═┴╪ ;╔S THE SUM > 2*PI?
┬├├ ─╧╬┼
╙┬├ #┴╬╟═┴╪ ;╔F SO, SUBTRACT 2*PI
─╧╬┼ <<<
╙╒┬┴ ═┴├ ;╙UBTRACT TWO ANGLES
╙┼├
╠─┴ ]1
╙┬├ ]2
┬├╙ ─╧╬┼
┴─├ #┴╬╟═┴╪ ;╧OPS, WE NEED TO ADD 2*PI
─╧╬┼ <<<
** ╬OW CALCULATE T1,T2,ETC.
>>> ╙╒┬┴,╙┘ ;╙┌
╙╘┴ ╘1 ;T1=SY-SZ
>>> ┴──┴,╙┘ ;╙┌
╙╘┴ ╘2 ;T2=SY+SZ
>>> ┴──┴,╙╪ ;╙┌
╙╘┴ ╘3 ;T3=SX+SZ
>>> ╙╒┬┴,╙╪ ;╙┌
╙╘┴ ╘4 ;T4=SX-SZ
>>> ┴──┴,╙╪ ;╘2
╙╘┴ ╘5 ;T5=SX+T2
>>> ╙╒┬┴,╙╪ ;╘1
╙╘┴ ╘6 ;T6=SX-T1
>>> ┴──┴,╙╪ ;╘1
╙╘┴ ╘7 ;T7=SX+T1
>>> ╙╒┬┴,╘2 ;╙╪
╙╘┴ ╘8 ;T8=T2-SX
>>> ╙╒┬┴,╙┘ ;╙╪
╙╘┴ ╘9 ;T9=SY-SX
>>> ┴──┴,╙╪ ;╙┘
╙╘┴ ╘10 ;T10=SX+SY
* ┼T VOILA!
*** ╬EXT, CALCULATE ┴,┬,├,...,╔
** ┴NOTHER USEFUL LITTLE MACRO
─╔╓2 ═┴├ ;─IVIDE A SIGNED NUMBER BY 2
;╔T IS ASSUMED THAT THE NUMBER
┬╨╠ ╨╧╙ ;IS IN THE ACCUMULATOR
├╠├
┼╧╥ #$╞╞ ;╫E NEED TO UN-NEGATIVE THE NUMBER
┴─├ #01 ;BY TAKING IT'S COMPLEMENT
╠╙╥ ;DIVIDE BY TWO
├╠├
┼╧╥ #$╞╞
┴─├ #01 ;═AKE IT NEGATIVE AGAIN
╩═╨ ─╧╬┼─╔╓
╨╧╙ ╠╙╥ ;╬UMBER IS POSITIVE
─╧╬┼─╔╓ <<<
═╒╠2 ═┴├ ;═ULTIPLY A SIGNED NUMBER BY 2
┬╨╠ ╨╧╙═
├╠├
┼╧╥ #$╞╞
┴─├ #$01
┴╙╠
├╠├
┼╧╥ #$╞╞
┴─├ #$01
╩═╨ ─╧╬┼═╒╠
╨╧╙═ ┴╙╠
─╧╬┼═╒╠ <<<
** ╬OTE THAT WE ARE CURRENTLY MAKING A MINOR LEAP
** OF FAITH THAT NO OVERFLOWS WILL OCCUR.
:├┴╠├┴ ├╠├
╠─╪ ╘1
╠─┴ ├╧╙,╪
╠─╪ ╘2
┴─├ ├╧╙,╪
╙╘┴ ┴11 ;┴=(COS(T1)+COS(T2))/2
:├┴╠├┬ ╠─╪ ╘1
╠─┴ ╙╔╬,╪
╙┼├
╠─╪ ╘2
╙┬├ ╙╔╬,╪
╙╘┴ ┬12 ;┬=(SIN(T1)-SIN(T2))/2
:├┴╠├├ ╠─╪ ╙┘
╠─┴ ╙╔╬,╪
>>> ═╒╠2
╙╘┴ ├13 ;├=SIN(SY)
:├┴╠├─ ╙┼├
╠─╪ ╘8
╠─┴ ├╧╙,╪
╠─╪ ╘7
╙┬├ ├╧╙,╪
╙┼├
╠─╪ ╘5
╙┬├ ├╧╙,╪
├╠├
╠─╪ ╘6
┴─├ ├╧╙,╪ ;─I=(COS(T8)-COS(T7)+COS(T6)-COS(T5))/2
>>> ─╔╓2
├╠├
╠─╪ ╘3
┴─├ ╙╔╬,╪
╙┼├
╠─╪ ╘4
╙┬├ ╙╔╬,╪
╙╘┴ ─21 ;─=(SIN(T3)-SIN(T4)+─I)/2
:├┴╠├┼ ╙┼├
╠─╪ ╘5
╠─┴ ╙╔╬,╪
╠─╪ ╘6
╙┬├ ╙╔╬,╪
╙┼├
╠─╪ ╘7
╙┬├ ╙╔╬,╪
╙┼├
╠─╪ ╘8
╙┬├ ╙╔╬,╪ ;┼I=(SIN(T5)-SIN(T6)-SIN(T7)-SIN(T8))/2
>>> ─╔╓2
├╠├
╠─╪ ╘3
┴─├ ├╧╙,╪
├╠├
╠─╪ ╘4
┴─├ ├╧╙,╪
╙╘┴ ┼22 ;┼=(COS(T3)+COS(T4)+┼I)/2
:├┴╠├╞ ╠─╪ ╘9
╠─┴ ╙╔╬,╪
╙┼├
╠─╪ ╘10
╙┬├ ╙╔╬,╪
╙╘┴ ╞23 ;╞=(SIN(T9)-SIN(T10))/2
:├┴╠├╟ ╠─╪ ╘6
╠─┴ ╙╔╬,╪
╙┼├
╠─╪ ╘8
╙┬├ ╙╔╬,╪
╙┼├
╠─╪ ╘7
╙┬├ ╙╔╬,╪
╙┼├
╠─╪ ╘5
╙┬├ ╙╔╬,╪ ;╟I=(SIN(T6)-SIN(T8)-SIN(T7)-SIN(T5))/2
>>> ─╔╓2
├╠├
╠─╪ ╘4
┴─├ ├╧╙,╪
╙┼├
╠─╪ ╘3
╙┬├ ├╧╙,╪
╙╘┴ ╟31 ;╟=(COS(T4)-COS(T3)+╟I)/2
:├┴╠├╚ ├╠├
╠─╪ ╘6
╠─┴ ├╧╙,╪
╠─╪ ╘7
┴─├ ├╧╙,╪
╙┼├
╠─╪ ╘5
╙┬├ ├╧╙,╪
╙┼├
╠─╪ ╘8
╙┬├ ├╧╙,╪ ;╚I=(COS(T6)+COS(T7)-COS(T5)-COS(T8))/2
>>> ─╔╓2
├╠├
╠─╪ ╘3
┴─├ ╙╔╬,╪
├╠├
╠─╪ ╘4
┴─├ ╙╔╬,╪
╙╘┴ ╚32 ;╚=(SIN(T3)+SIN(T4)+╚I)/2
:╫╚┼╫ ├╠├
╠─╪ ╘9
╠─┴ ├╧╙,╪
╠─╪ ╘10
┴─├ ├╧╙,╪
╙╘┴ ╔33 ;╔=(COS(T9)+COS(T10))/2
** ╔T'S ALL DOWNHILL FROM HERE.
╩═╨ ─╧╫╬╚╔╠╠
╘╪╘ '╟EE ┬RAIN, WHAT DO YOU WANT TO DO '
╘╪╘ 'TONIGHT?'
** ╥OTATE, PROJECT, AND STORE THE POINTS
─╧╫╬╚╔╠╠
* ┴ NEAT MACRO
╬┼╟ ═┴├ ;├HANGE THE SIGN OF A TWO'S COMPLEMENT
├╠├
╠─┴ ]1 ;NUMBER.
┼╧╥ #$╞╞
┴─├ #$01
<<<
*-------------------------------
* ╘HESE MACROS REPLACE THE PREVIOUS PROJECTION
* SUBROUTINE.
╙═╒╠╘ ═┴├ ;═ULTIPLY TWO SIGNED 8-BIT
;NUMBERS: ┴*┘/64 -> ┴
╙╘┴ ┌1
├╠├
┼╧╥ #$╞╞
┴─├ #$01
╙╘┴ ┌2
╠─┴ (┌1),┘
╙┼├
╙┬├ (┌2),┘
<<< ;┴LL DONE :)
┴──╙╒┬ ═┴├ ;┴DD OR SUBTRACT TWO NUMBERS
;DEPENDING ON FIRST INPUT
╔╞ -=]1 ;╔F SUBTRACT
╙┼├ ;THEN USE THIS CODE
╙┬├ ]2
┼╠╙┼ ;OTHERWISE USE THIS CODE
├╠├
┴─├ ]2
╞╔╬
<<<
╨╥╧╩┼├╘ ═┴├ ;╘HE ACTUAL PROJECTION ROUTINE
;TWO INPUTS ARE USED (X,Y)
;CORRESPONDING TO (+/-1,+/-1)
;╘HE THIRD INPUT IS USED TO
;DETERMINE IF THE ROTATED
;Z-COORDINATE SHOULD BE
;STORED, AND IF SO WHERE.
;╘HE CALLING ROUTINE HANDLES
;CHANGING THE SIGN OF Z.
╠─┴ ╔33 ;├ALCULATE ROTATED Z:
>>> ┴──╙╒┬,]1 ;╟31 ;┴DD OR SUBTRACT X
>>> ┴──╙╒┬,]2 ;╚32 ;┴DD OR SUBTRACT Y
╔╞ ╨,]3 ;─O WE NEED TO STORE THE POINT?
╙╘┴ ]3 ;╘HEN DO SO!
╞╔╬
* ┼╧╥ #128 ;╫E ARE GOING TO TAKE 128+Z
╘┴╪ ;╬OW IT IS READY FOR INDEXING
╠─┴ ┌─╔╓,╪ ;╘ABLE OF D/(Z+Z0)
╘┴┘ ;┘ NOW CONTAINS PROJECTION
╠─┴ ├13 ;╬OW CALCULATE ROTATED X
>>> ┴──╙╒┬,]1 ;┴11
>>> ┴──╙╒┬,]2 ;┬12
>>> ╙═╒╠╘ ;╙IGNED MULTIPLY ┴*┘/64->┴
├╠├
┴─├ #64 ;╧FFSET THE COORDINATE
╘┴╪ ;╬OW ╪ IS ROTATED X!
╠─┴ ╞23 ;╬OW IT'S Y'S TURN
>>> ┴──╙╒┬,]1 ;─21
>>> ┴──╙╒┬,]2 ;┼22
>>> ╙═╒╠╘
├╠├
┴─├ #64 ;╧FFSET
├═╨ ┘═╔╬ ;╞IGURE OUT IF IT IS A
┬├╙ ╬╧╘═╔╬ ;MIN OR MAX VALUE FOR Y
╙╘┴ ┘═╔╬
┬├├ ╬╧╘═┴╪ ;╘HIS IS USED IN CALCULATING
╬╧╘═╔╬ ├═╨ ┘═┴╪ ;THE FILLED FACES
┬├├ ╬╧╘═┴╪
╙╘┴ ┘═┴╪
╬╧╘═┴╪ ╘┴┘ ;╬OT REALLY NECESSARY
<<< ;┴LL DONE
╠─┴ #64 ;╥ESET ┘MIN AND ┘MAX
╙╘┴ ┘═╔╬
╙╘┴ ┘═┴╪
* ╨1=[1 1 1]
>>> ╨╥╧╩┼├╘,1;1;╨1┌ ;╥OTATED Z STORED IN ╨1┌
╙╘╪ ╨1╪
╙╘┘ ╨1┘
* ╨2=[1 -1 1]
>>> ╨╥╧╩┼├╘,1 ;-1;╨2┌
╙╘╪ ╨2╪
╙╘┘ ╨2┘
* ╨3=[-1 -1 1]
>>> ╨╥╧╩┼├╘,-1;-1;╬╧╨┼ ;─ON'T STORE Z-VALUE
╙╘╪ ╨3╪
╙╘┘ ╨3┘
* ╨4=[-1 1 1]
>>> ╨╥╧╩┼├╘,-1;1;╨4┌
╙╘╪ ╨4╪
╙╘┘ ╨4┘
* ╨8=[-1 1 -1]
>>> ╬┼╟,├13
╙╘┴ ├13
>>> ╬┼╟,╞23
╙╘┴ ╞23
>>> ╬┼╟,╔33
╙╘┴ ╔33
>>> ╨╥╧╩┼├╘,-1;1;╬╧╨┼
╙╘╪ ╨8╪
╙╘┘ ╨8┘
* ╨7=[-1 -1 -1]
>>> ╨╥╧╩┼├╘,-1;-1;╬╧╨┼
╙╘╪ ╨7╪
╙╘┘ ╨7┘
* ╨6=[1 -1 -1]
>>> ╨╥╧╩┼├╘,1;-1;╬╧╨┼
╙╘╪ ╨6╪
╙╘┘ ╨6┘
* ╨5=[1 1 -1]
>>> ╨╥╧╩┼├╘,1;1;╨5┌
╙╘╪ ╨5╪
╙╘┘ ╨5┘
* ┴ LITTLE MACRO
╙┼╘┬╒╞ ═┴├ ;╨UT BUFFERS WHERE THEY CAN BE HURT
╠─┴ #00
╙╘┴ ┬╒╞╞┼╥
╠─┴ ┌╘┼═╨ ;ZTEMP CONTAINS THE HIGH BYTE HERE
╙╘┴ ┬╒╞╞┼╥+1
<<<
**** ├LEAR BUFFER
* >>> ╙┼╘┬╒╞
*├╠╥┬╒╞ ╠─┴ #$00 ;╨RETTY STRAIGHTFORWARD,
* ╠─╪ #$08 ;╔ THINK
* ╠─┘ #$00
*:╠╧╧╨ ╙╘┴ (┬╒╞╞┼╥),┘
* ╔╬┘
* ┬╬┼ :╠╧╧╨
* ╔╬├ ┬╒╞╞┼╥+1
* ─┼╪
* ┬╬┼ :╠╧╧╨
* ╘HIS IS THE NEW AND IMPROVED BUFFER CLEAR
* ROUTINE FOR FILLED FACES
>>> ╙┼╘┬╒╞
╙╘┴ ╘┼═╨1+1 ;BUFFER2 WILL POINT TO
╠─┴ #$80 ;BUFFER+128
╙╘┴ ╘┼═╨1 ;═AKES LIFE FASTER FOR US
╞╔╠├╠╥ ╠─┴ #00
╠─╪ #$08 ;╫E'LL DO IT TWO AT A TIME
╠─┘ #$00
:╠╧╧╨1 ╙╘┴ (┬╒╞╞┼╥),┘
╙╘┴ (╘┼═╨1),┘
╔╬┘
├╨┘ ┘═╔╬
┬╬┼ :╠╧╧╨1
╠─┴ #$╞╞ ;╬OW LOAD WITH FILLS
:╠╧╧╨2 ╙╘┴ (┬╒╞╞┼╥),┘
╙╘┴ (╘┼═╨1),┘
╔╬┘
├╨┘ ┘═┴╪
┬├├ :╠╧╧╨2
╠─┴ #$00 ;┬LACK OUT THE REST
:╠╧╧╨3 ╙╘┴ (┬╒╞╞┼╥),┘
╙╘┴ (╘┼═╨1),┘
╔╬┘
┬╨╠ :╠╧╧╨3 ;╒NTIL ┘=128
╠─┘ #00
╔╬├ ┬╒╞╞┼╥+1
╔╬├ ╘┼═╨1+1
─┼╪
┬╬┼ :╠╧╧╨1 ;╟O ALL THE WAY AROUND
**** ╬OW DRAW THE LINES.
**** ┬UT FIRST CHECK FOR HIDDEN FACES!
**** ╥EMEMBER: ╨1=[1 1 1] ╨2=[1 -1 1] ╨3=[-1 -1 1]
**** ╨4=[-1 1 1] ╨5=[1 1 -1] ╨6=[1 -1 -1] ╨7=[-1 -1 -1]
**** ╨8=[-1 1 -1]
╠╔╬┼╙ ╠─┴ #00
╙╘┴ ╞┴├┼╙ ;╚IDDEN FACE COUNTER
:╞┴├┼1 ╠─┴ ╦
╙┼├
╙┬├ ╨1┌
┬╓╙ :╞┴├┼6 ;╧VERFLOW ALREADY?
├╠├
┴─├ ╨5┌ ;╔S K-V1Z < 0?
;╔F NOT, FACE IS INVISIBLE
┬╓├ :─╥┴╫1 ;┬UT WE MIGHT HAVE OVERFLOW
╠─┴ ╨5┌ ;╫AS OVERFLOW POS OR NEG?
:─╥┴╫1 ┬╨╠ :╞┴├┼6 ;╔F POS THEN K-V1Z > 0
╠─┴ #$01 ;╧THERWISE, DRAW THE
╙╘┴ ╞┴├┼╙ ;FACE!
╠─┴ ╨1╪
╙╘┴ ╘╪1
╠─┴ ╨1┘
╙╘┴ ╘┘1
╠─┴ ╨2╪
╙╘┴ ╘╪2
╠─┴ ╨2┘
╙╘┴ ╘┘2
╩╙╥ ─╥┴╫ ;╨1-╨2
╠─┴ ╨3╪
╙╘┴ ╘╪1
╠─┴ ╨3┘
╙╘┴ ╘┘1
╩╙╥ ─╥┴╫ ;╨2-╨3
╠─┴ ╨4╪
╙╘┴ ╘╪2
╠─┴ ╨4┘
╙╘┴ ╘┘2
╩╙╥ ─╥┴╫ ;╨3-╨4
╠─┴ ╨1╪
╙╘┴ ╘╪1
╠─┴ ╨1┘
╙╘┴ ╘┘1
╩╙╥ ─╥┴╫ ;╨4-╨1 ╞ACE 1 DONE.
╩═╨ :╞┴├┼2 ;╔F ONE IS VISIBLE, THE OTHER
;ISN'T.
:╞┴├┼6 ╠─┴ ╦
╙┼├
╙┬├ ╨5┌
┬╓╙ :╞┴├┼2
├╠├
┴─├ ╨1┌ ;╬OW CHECK IF ╦-V6Z < 0
┬╓├ :─╥┴╫6 ;╠OVE THAT OVERFLOW
╠─┴ ╨1┌
:─╥┴╫6 ┬╨╠ :╞┴├┼2 ;╔F NOT, GO ON
╠─┴ #$20
╙╘┴ ╞┴├┼╙ ;╧THERWISE, DRAW IT
╠─┴ ╨5╪
╙╘┴ ╘╪2
╠─┴ ╨5┘
╙╘┴ ╘┘2
╠─┴ ╨6╪
╙╘┴ ╘╪1
╠─┴ ╨6┘
╙╘┴ ╘┘1
╩╙╥ ─╥┴╫ ;╨5-╨6
╠─┴ ╨7╪
╙╘┴ ╘╪2
╠─┴ ╨7┘
╙╘┴ ╘┘2
╩╙╥ ─╥┴╫ ;╨6-╨7
╠─┴ ╨8╪
╙╘┴ ╘╪1
╠─┴ ╨8┘
╙╘┴ ╘┘1
╩╙╥ ─╥┴╫ ;╨7-╨8
╠─┴ ╨5╪
╙╘┴ ╘╪2
╠─┴ ╨5┘
╙╘┴ ╘┘2
╩╙╥ ─╥┴╫ ;╨8-╨5
:╞┴├┼2 ╠─┴ ╦
╙┼├
╙┬├ ╨1┌
┬╓╙ :╞┴├┼5
├╠├
┴─├ ╨4┌ ;╦-V2Z < 0?
┬╓├ :─╥┴╫2
╠─┴ ╨4┌
:─╥┴╫2 ┬╨╠ :╞┴├┼5
╠─┴ #$02 ;╔F SO, DRAW IT!
╧╥┴ ╞┴├┼╙
╙╘┴ ╞┴├┼╙
╠─╪ ╨1╪ ;╫E'RE DOING THIS THIS WAY
╙╘╪ ╘╪1 ;TO SAVE A FEW CYCLES
╠─╪ ╨1┘
╙╘╪ ╘┘1
┴╬─ #$01 ;╙HARES AN EDGE WITH FACE 1
┬╬┼ :╞2╙2 ;╙KIP TO NEXT EDGE IF PRESENT
╠─┴ ╨2╪
╙╘┴ ╘╪2
╠─┴ ╨2┘
╙╘┴ ╘┘2
╩╙╥ ─╥┴╫ ;╨1-╨2
:╞2╙2 ╠─╪ ╨5╪
╙╘╪ ╘╪2
╠─╪ ╨5┘
╙╘╪ ╘┘2
╩╙╥ ─╥┴╫ ;╨1-╨5
╠─╪ ╨6╪
╙╘╪ ╘╪1
╠─╪ ╨6┘
╙╘╪ ╘┘1
╠─┴ ╞┴├┼╙
┴╬─ #$20 ;┴LSO SHARES AN EDGE WITH 6
┬╬┼ :╞2╙4
╩╙╥ ─╥┴╫ ;╨5-╨6
:╞2╙4 ╠─┴ ╨2╪
╙╘┴ ╘╪2
╠─┴ ╨2┘
╙╘┴ ╘┘2 ;╙UCH IS FACE 2
╩╙╥ ─╥┴╫ ;╨6-╨2
╩═╨ :╞┴├┼3 ;╙KIP 5
:╞┴├┼5 ╠─┴ ╦
╙┼├
╙┬├ ╨4┌
┬╓╙ :╞┴├┼3
├╠├
┴─├ ╨1┌ ;╙AME THING AGAIN...
┬╓├ :─╥┴╫5
╠─┴ ╨1┌
:─╥┴╫5 ┬╨╠ :╞┴├┼3
╠─┴ #$10
╧╥┴ ╞┴├┼╙
╙╘┴ ╞┴├┼╙
╠─╪ ╨3╪
╙╘╪ ╘╪1
╠─╪ ╨3┘
╙╘╪ ╘┘1
┴╬─ #$01 ;╙HARES WITH 1
┬╬┼ :╞5╙2
╠─┴ ╨4╪
╙╘┴ ╘╪2
╠─┴ ╨4┘
╙╘┴ ╘┘2
╩╙╥ ─╥┴╫ ;╨3-╨4
:╞5╙2 ╠─┴ ╨7╪
╙╘┴ ╘╪2
╠─┴ ╨7┘
╙╘┴ ╘┘2
╩╙╥ ─╥┴╫ ;╨3-╨7
╠─┴ ╨8╪
╙╘┴ ╘╪1
╠─┴ ╨8┘
╙╘┴ ╘┘1
╠─┴ ╞┴├┼╙
┴╬─ #$20 ;╙HARES WITH 6
┬╬┼ :╞5╙4
╩╙╥ ─╥┴╫ ;╨7-╨8
:╞5╙4 ╠─┴ ╨4╪
╙╘┴ ╘╪2
╠─┴ ╨4┘
╙╘┴ ╘┘2 ;╨8-╨4
╩╙╥ ─╥┴╫ ;╘WO MORE TO GO!
:╞┴├┼3 ╠─┴ ╦
╙┼├
╙┬├ ╨1┌
┬╓╙ :╞┴├┼4
├╠├
┴─├ ╨2┌
┬╓├ :─╥┴╫3
╠─┴ ╨2┌
:─╥┴╫3 ┬╨╠ :╞┴├┼4 ;┴H RECKON IT'S A'HIDDEN, YUP
╠─┴ #$04
╧╥┴ ╞┴├┼╙
╙╘┴ ╞┴├┼╙
╠─╪ ╨1╪
╙╘╪ ╘╪1
╠─╪ ╨1┘
╙╘╪ ╘┘1
┴╬─ #$01 ;╙HARES WITH 1
┬╬┼ :╞3╙2
╠─┴ ╨4╪
╙╘┴ ╘╪2
╠─┴ ╨4┘
╙╘┴ ╘┘2
╩╙╥ ─╥┴╫ ;╨1-╨4
:╞3╙2 ╠─╪ ╨5╪
╙╘╪ ╘╪2
╠─╪ ╨5┘
╙╘╪ ╘┘2
╠─┴ ╞┴├┼╙
┴╬─ #$02 ;╙HARES WITH 2
┬╬┼ :╞3╙3
╩╙╥ ─╥┴╫ ;╨1-╨5
:╞3╙3 ╠─╪ ╨8╪
╙╘╪ ╘╪1
╠─╪ ╨8┘
╙╘╪ ╘┘1
╠─┴ ╞┴├┼╙
┴╬─ #$20 ;╙HARES WITH 6
┬╬┼ :╞3╙4
╩╙╥ ─╥┴╫ ;╨5-╨8
:╞3╙4 ╠─╪ ╨4╪
╙╘╪ ╘╪2
╠─╪ ╨4┘
╙╘╪ ╘┘2
╠─┴ ╞┴├┼╙
┴╬─ #$10 ;╙HARES WITH 5
┬╬┼ ╞┴├┼─╧╬┼
╩╙╥ ─╥┴╫ ;╨8-╨4
╩═╨ ╞┴├┼─╧╬┼
:╞┴├┼4 ╠─┴ ╦
╙┼├
╙┬├ ╨2┌
┬╓╙ ╞┴├┼─╧╬┼
├╠├
┴─├ ╨1┌
┬╓├ :─╥┴╫4
╠─┴ ╨1┌
:─╥┴╫4 ┬╨╠ ╞┴├┼─╧╬┼
╠─┴ ╨2╪
╙╘┴ ╘╪1
╠─┴ ╨2┘
╙╘┴ ╘┘1
╠─┴ ╞┴├┼╙
┴╬─ #$01 ;╙HARES WITH 1
┬╬┼ :╞4╙2
╠─┴ ╨3╪
╙╘┴ ╘╪2
╠─┴ ╨3┘
╙╘┴ ╘┘2
╩╙╥ ─╥┴╫ ;╨2-╨3
:╞4╙2 ╠─┴ ╨6╪
╙╘┴ ╘╪2
╠─┴ ╨6┘
╙╘┴ ╘┘2
╠─┴ ╞┴├┼╙
┴╬─ #$02 ;╙HARES WITH 2
┬╬┼ :╞4╙3
╩╙╥ ─╥┴╫ ;╨2-╨6
:╞4╙3 ╠─┴ ╨7╪
╙╘┴ ╘╪1
╠─┴ ╨7┘
╙╘┴ ╘┘1
╠─┴ ╞┴├┼╙
┴╬─ #$20 ;╙HARES WITH 6
┬╬┼ :╞4╙4
╩╙╥ ─╥┴╫ ;╨6-╨7
:╞4╙4 ╠─┴ ╨3╪
╙╘┴ ╘╪2
╠─┴ ╨3┘
╙╘┴ ╘┘2
╠─┴ ╞┴├┼╙
┴╬─ #$10 ;╙HARES WITH 5
┬╬┼ ╞┴├┼─╧╬┼
╩╙╥ ─╥┴╫ ;╨7-╨3
╞┴├┼─╧╬┼ ;╫HEW! ╘IME FOR A BEER.
**** ╬OW WE NEED TO UNFILL THE OUTSIDE FROM THE FACES
╒╬╞╔╠╠ ╠─┘ ┘═╔╬
:╠╧╧╨ >>> ╙┼╘┬╒╞
╠─╪ #08
:╠1 ╠─┴ (┬╒╞╞┼╥),┘
┼╧╥ #$╞╞ ;╟O TILL WE FIND A PLOTTED
┬╬┼ :╟╧╘├╚┴ ;POINT (I.E. ┴ <> $╞╞)
* ╠─┴ #00 ;╒NFILLING AS WE GO...
╙╘┴ (┬╒╞╞┼╥),┘
╠─┴ #$80
╙╘┴ ┬╒╞╞┼╥
╠─┴ (┬╒╞╞┼╥),┘
┼╧╥ #$╞╞
┬╬┼ :╟╧╘├╚┴
* ╠─┴ #00
╙╘┴ (┬╒╞╞┼╥),┘
╙╘┴ ┬╒╞╞┼╥
╔╬├ ┬╒╞╞┼╥+1
─┼╪ ;╘HIS IS OUR SAFETY VALVE
┬╬┼ :╠1 ;╥EALLY SHOULDN'T NEED IT
╩╙╥ ├╚╧╦┼
╩═╨ ╙╫┴╨┬╒╞
:╟╧╘├╚┴ ;┴ CONTAINS THE ┼╧╥ PLOT VALUE
╙╘┴ ╘┼═╨1 ;╬OW FIND THE HIGH BIT
╠─┴ #00
:╠2 ╙┼├
╥╧╠
╠╙╥ ╘┼═╨1 ;╙HOULD REALLY USE A TABLE
┬╬┼ :╠2 ;FOR THIS!
┴╬─ (┬╒╞╞┼╥),┘
╙╘┴ (┬╒╞╞┼╥),┘
╠─┴ ┌╘┼═╨ ;╬OW GO TO THE END
;├ARRY IS CLEAR
;┴CTUALLY WE ADD 7
┴─├ #$06 ;16 COLUMNS OF 128 BYTES
╙╘┴ ┬╒╞╞┼╥+1
╠─┴ #$80
╙╘┴ ┬╒╞╞┼╥
:╠╧╧╨2 ╠─┴ (┬╒╞╞┼╥),┘ ;┴ND WORK BACKWARDS!
┼╧╥ #$╞╞
┬╬┼ :╟╧╘├╚┴2
╙╘┴ (┬╒╞╞┼╥),┘
╙╘┴ ┬╒╞╞┼╥ ;╙TICK A ZERO INTO BUFFER
╠─┴ (┬╒╞╞┼╥),┘
┼╧╥ #$╞╞
┬╬┼ :╟╧╘├╚┴2
╙╘┴ (┬╒╞╞┼╥),┘
╠─┴ #$80
╙╘┴ ┬╒╞╞┼╥
─┼├ ┬╒╞╞┼╥+1
┬╬┼ :╠╧╧╨2
:╟╧╘├╚┴2 ╙╘┴ ╘┼═╨1 ;┴GAIN FIND THE HIGH BIT
╠─┴ #00
:╠3 ╙┼├
╥╧╥
┴╙╠ ╘┼═╨1
┬╬┼ :╠3
┴╬─ (┬╒╞╞┼╥),┘
╙╘┴ (┬╒╞╞┼╥),┘
╔╬┘ ;╬OW KEEP GOING
├╨┘ ┘═┴╪
┬├├ :╠╧╧╨ ;╒NTIL WE HIT YMAX!
┬┼╤ :╠╧╧╨ ;╫E NEED THE LAST ONE TOO.
**** ╙WAP BUFFERS
╙╫┴╨┬╒╞ ╠─┴ ╓═├╙┬
┼╧╥ #$02 ;╨RETTY TRICKY, EH?
╙╘┴ ╓═├╙┬
╠─┴ #$08
┼╧╥ ┌╘┼═╨ ;ZTEMP=HIGH BYTE JUST FLIPS
╙╘┴ ┌╘┼═╨ ;BETWEEN $30 AND $38
╩═╨ ═┴╔╬ ;┴ROUND AND AROUND WE GO...
╘╪╘ '╙AME THING WE DO EVERY NIGHT, ╨INKY: '
╘╪╘ 'TRY TO TAKE OVER THE WORLD!'
*-------------------------------
* ╟ENERAL QUESTIONABLE-VALUE ERROR PROCEDURE
├╚╧╦┼ ╠─╪ #00
:╠╧╧╨ ╠─┴ :├╘┼╪╘,╪
┬┼╤ :─╧╬┼
╩╙╥ ├╚╥╧╒╘
╔╬╪
╩═╨ :╠╧╧╨
:─╧╬┼ ╥╘╙
:├╘┼╪╘ ╚┼╪ 0─ ;├╥
╘╪╘ 'SOMETHING CHOKED :('
╚┼╪ 0─00
╘╪╘ '╬ARF!'
*-------------------------------
* ─RAWIN' A LINE. ┴ FAHN LAHN.
*** ╙OME USEFUL MACROS
╨╠╧╘╨╪ ═┴├ ;PLOT A POINT IN X
╨╚┴ ;╒SE THIS ONE EVERY TIME
╠─┴ ┬╔╘╨,╪ ;╪ IS INCREASED
┬═╔ ├1
╠─┴ #$80 ;╘ABLE HAS BEEN REARRANGED
┼╧╥ ┬╒╞╞┼╥ ;FOR FILLING FACES
╙╘┴ ┬╒╞╞┼╥
┬═╔ ├2
╔╬├ ┬╒╞╞┼╥+1
├2 ╠─┴ #%01111111 ;╬OTE THAT THIS IS CHANGED
├1 ┴╬─ (┬╒╞╞┼╥),┘ ;FOR PLOTTING FILLED FACES
╙╘┴ (┬╒╞╞┼╥),┘
╨╠┴ ;╬EED TO SAVE ┴!
<<<
╨╠╧╘╨┘ ═┴├ ;╨LOT A POINT IN Y: SIMPLER AND NECESSARY!
╨╚┴ ;╒SE THIS ONE WHEN YOU JUST INCREASE ┘
╠─┴ ┬╔╘╨,╪ ;BUT ╪ DOESN'T CHANGE
┴╬─ (┬╒╞╞┼╥),┘
╙╘┴ (┬╒╞╞┼╥),┘
╨╠┴
<<<
├╔╬╔╘ ═┴├ ;═ACRO TO INITIALIZE THE COUNTER
╠─┴ ]1 ;DX OR DY
╠╙╥
┼╧╥ #$╞╞ ;(╬OT REALLY TWO'S COMPLEMENT)
┴─├ #$01 ;┴ = 256-DX/2 OR 256-DY/2
<<< ;╘HE DX/2 MAKES A NICER LOOKING LINE
╪╙╘┼╨ ═┴├ ;═ACRO TO TAKE A STEP IN ╪
╪╠╧╧╨ ╔╬╪
┴─├ ─┘
┬├├ ╠1
* ─O WE USE ╔╬┘ OR ─┼┘ HERE?
╔╞ ╔,]1 ;╔F THE FIRST CHARACTER IS AN '╔'
╔╬┘
┼╠╙┼
─┼┘
╞╔╬
╙┬├ ─╪
╠1 >>> ╨╠╧╘╨╪ ;┴LWAYS TAKE A STEP IN ╪
├╨╪ ╪2
┬╬┼ ╪╠╧╧╨
<<<
┘╙╘┼╨ ═┴├ ;╙AME THING, BUT FOR ┘
┘╠╧╧╨ ╔╞ ╔,]1
╔╬┘
┼╠╙┼
─┼┘
├╠├ ;╓ERY IMPORTANT!
╞╔╬
┴─├ ─╪
┬├├ ╠2
╔╬╪ ;┴LWAYS INCREASE ╪
╙┬├ ─┘
>>> ╨╠╧╘╨╪
╩═╨ ╠3
╠2 >>> ╨╠╧╘╨┘ ;╫E ONLY INCREASED ┘
╠3 ├╨┘ ┘2
┬╬┼ ┘╠╧╧╨
<<<
**** ╔NITIAL LINE SETUP
─╥┴╫ >>> ═╧╓┼,╘╪1 ;╪1 ;═OVE STUFF INTO ZERO PAGE
>>> ═╧╓┼,╘╪2 ;╪2 ;╫HERE IT CAN BE MODIFIED
>>> ═╧╓┼,╘┘1 ;┘1
>>> ═╧╓┼,╘┘2 ;┘2
>>> ╙┼╘┬╒╞ ;╬OW WE CAN CLOBBER THE BUFFER
╙┼├ ;═AKE SURE X1<X2
╠─┴ ╪2
╙┬├ ╪1
┬├╙ :├╧╬╘
╠─┴ ┘2 ;╔F NOT, SWAP ╨1 AND ╨2
╠─┘ ┘1
╙╘┴ ┘1
╙╘┘ ┘2
╠─┴ ╪1
╠─┘ ╪2
╙╘┘ ╪1
╙╘┴ ╪2
╙┼├
╙┬├ ╪1 ;╬OW ┴=DX
:├╧╬╘ ╙╘┴ ─╪
╠─╪ ╪1 ;╨UT X1 INTO ╪, NOW WE CAN TRASH ╪1
├╧╠╒═╬ ╠─┴ ╪1 ;╞IND THE FIRST COLUMN FOR ╪
╠╙╥ ;(╘HIS CAN BE MADE MUCH FASTER!)
╠╙╥ ;╘HERE ARE X1/8 128 BYTE BLOCKS
╠╙╥ ;╫HICH MEANS X1/16 256 BYTE BLOCKS
╠╙╥
┬├├ :┼╓┼╬ ;╫ITH A POSSIBLE EXTRA 128 BYTE BLOCK
╠─┘ #$80 ;IF SO, SET THE HIGH BIT
╙╘┘ ┬╒╞╞┼╥
├╠├
:┼╓┼╬ ┴─├ ┬╒╞╞┼╥+1 ;┴DD IN THE NUMBER OF 256 BYTE BLOCKS
╙╘┴ ┬╒╞╞┼╥+1 ;┴ND STORE IT!
╙┼├
╠─┴ ┘2 ;├ALCULATE DY
╙┬├ ┘1
┬├╙ :├╧╬╘2 ;╔S Y2>Y1?
┼╧╥ #$╞╞ ;╧THERWISE DY=Y1-Y2
┴─├ #$01
:├╧╬╘2 ╙╘┴ ─┘
├═╨ ─╪ ;╫HO'S BIGGER: DY OR DX?
┬├╙ ╙╘┼╨╔╬┘ ;╔F DY, WE NEED TO TAKE BIG STEPS IN Y
╙╘┼╨╔╬╪ ╠─┘ ┘1 ;╪ IS ALREADY SET TO X1
╠─┴ ┬╔╘╨,╪ ;╨LOT THE FIRST POINT
┴╬─ (┬╒╞╞┼╥),┘
╙╘┴ (┬╒╞╞┼╥),┘
>>> ├╔╬╔╘,─╪ ;╔NITIALIZE THE COUNTER
├╨┘ ┘2
┬├╙ ╪─┼├┘ ;─O WE STEP FORWARDS OR BACKWARDS IN ┘?
╪╔╬├┘ >>> ╪╙╘┼╨,╔╬┘
╥╘╙
╙╘┼╨╔╬┘ ╠─┘ ┘1 ;╫ELL, A LITTLE REPETITION NEVER HURT ANYONE
╠─┴ ┬╔╘╨,╪
┴╬─ (┬╒╞╞┼╥),┘
╙╘┴ (┬╒╞╞┼╥),┘
>>> ├╔╬╔╘,─┘
├╨┘ ┘2
┬├╙ ┘─┼├┘
┘╔╬├┘ >>> ┘╙╘┼╨,╔╬┘
╥╘╙
╪─┼├┘ >>> ╪╙╘┼╨,─┼┘ ;╘HIS IS PUT HERE SO THAT
╥╘╙ ;┬RANCHES ARE LEGAL
┘─┼├┘ >>> ┘╙╘┼╨,─┼┘
╥╘╙
*-------------------------------
* ├LEAN UP
├╠┼┴╬╒╨ ╠─┴ ╓═├╙┬ ;╙WITCH CHAR ROM BACK IN
┴╬─ #%11110101 ;DEFAULT
╙╘┴ ╓═├╙┬
╥╘╙ ;BYE!
╘╪╘ '╚APPY ╚OLIDAYS! '
╘╪╘ 'SLJ 12/94'
*-------------------------------
* ╙ET UP BIT TABLE
─╙ ^ ;├LEAR TO END OF PAGE
;╙O THAT TABLES START ON A PAGE BOUNDARY
┬╔╘╨ ╠╒╨ 16 ;128 ┼NTRIES FOR ╪
─╞┬ %01111111
─╞┬ %10111111
─╞┬ %11011111
─╞┬ %11101111
─╞┬ %11110111
─╞┬ %11111011
─╞┬ %11111101
─╞┬ %11111110
--^
╙╔╬ ;╘ABLE OF SINES, 120 BYTES
├╧╙ ┼╤╒ ╙╔╬+128 ;╘ABLE OF COSINES
;┬OTH OF THESE TRIG TABLES ARE
;CURRENTLY SET UP FROM ┬┴╙╔├
┌─╔╓ ┼╤╒ ├╧╙+128 ;─IVISION TABLE
╘═┴╘╚ ┼╤╒ ┌─╔╓+384 ;═ATH TABLE OF F(X)=X*X/256